plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.2'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'jacoco'
}

group = 'com.flab'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // mybatis와 관련된 dependency (jdbc, mybatis)
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
    testImplementation("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.2")
    // mybatis sql log
    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

    // DB
    implementation 'mysql:mysql-connector-java:8.0.32'

    // Redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'
    implementation 'org.redisson:redisson-spring-boot-starter:3.23.2'

    // jackson
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

    // rabbitmq
    implementation 'org.springframework.boot:spring-boot-starter-amqp'

    // Test container
    testImplementation 'org.testcontainers:testcontainers:1.19.3'
    testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
    testImplementation "org.testcontainers:mysql:1.16.3"
    testImplementation "org.testcontainers:rabbitmq:1.19.6"
    testImplementation 'org.awaitility:awaitility:4.2.1'


    // thymeleaf (sse 알림 확인용 서버사이드 랜더링)
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.projectlombok:lombok:1.18.28'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    testImplementation group: 'org.springframework.security', name: 'spring-security-test'
    implementation 'org.springframework.boot:spring-boot-starter-validation'


}

tasks.named('test') {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

// jacoco report 설정
jacocoTestReport {
    reports {
        // html로 report 생성하기
        // 빌드경로/jacoco/report.html 폴더 내부로 경로 설정
        html.destination file("$buildDir/jacoco/report.html")
    }

    // jacocoTestReport가 끝나면 jacocoTestCoverageVerification 동작
    finalizedBy 'jacocoTestCoverageVerification'
}

// jacoco 커버리지 검증 설정
jacocoTestCoverageVerification {
    violationRules {
        rule {
            enabled = true // 커버리지 적용 여부
            element = 'CLASS' // 커버리지 적용 단위

            // 라인 커버리지 설정
            // 적용 대상 전체 소스 코드들을 한줄 한줄 따졌을 때 테스트 코드가 작성되어 있는 줄의 빈도
            // 테스트 코드가 작성되어 있는 비율이 85% 이상이어야 함
            limit {
                counter = 'LINE'
                value = 'COVEREDRATIO'
                minimum = 0.00
            }

            // 라인 최대 갯수 설정
            // 빈 줄을 제외하고 하나의 자바 파일에서 작성될 수 있는 최대 라인 갯수
            // 한 파일에 최대 500줄까지 작성되어야 함
            limit {
                counter = 'LINE'
                value = 'TOTALCOUNT'
                maximum = 500
            }
            afterEvaluate {

                classDirectories.setFrom(files(classDirectories.files.collect {
                    fileTree(dir: it,
                            exclude: [
                                    "com/flab/offcoupon/component/**",
                                    "com/flab/offcoupon/exception/**", "com/flab/offcoupon/config/**",
                                    "com/flab/offcoupon/OffcouponApplication.class",
                                    "com/flab/offcoupon/util/**"])
                }))
            }
        }
    }
}