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

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

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

jacoco {
    toolVersion = "0.8.12"
    reportsDirectory = layout.buildDirectory.dir('jacocoReport')
}

def QDomains = []

for (qPattern in '**/QA'..'**/QZ') {
    QDomains.add(qPattern + '*')
}

jacocoTestReport {
    dependsOn test

    classDirectories.setFrom(files(classDirectories.files.collect {
        fileTree(dir: it, excludes: [
                '**/*Application*',
                '**/exception/**',
                '**/config/**',
                '**/dto/**',
                '**/s3/**',
                '**/security/**'
        ] + QDomains)
    }))

    reports {
        html.required.set(true)
        xml.required.set(true)
        csv.required.set(true)
    }
}

jacocoTestCoverageVerification {
    violationRules {
        rule {
            enabled = true
            element = 'CLASS'

            limit {
                counter = 'LINE'
                value = 'COVERERDRATIO'
                minimum = 0.65
            }
        }

        rule {
            excludes = [
                    '**/*Application*',
                    '**/exception/**',
                    '**/config/**',
                    '**/dto/**',
                    '**/s3/**',
                    '**/security/**'
            ] + QDomains
        }
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    runtimeOnly 'com.mysql:mysql-connector-j'

    // lombok 설정
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok:1.18.22'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'

    // JUnit
    testImplementation "org.junit.jupiter:junit-jupiter:5.8.1"

    // TestContainer
    testImplementation "org.testcontainers:testcontainers:1.20.1"
    testImplementation "org.testcontainers:junit-jupiter:1.20.1"
    // mongoDB 컨테이너
    testImplementation "org.testcontainers:mongodb:1.20.1"
    // mysql 컨테이너
    testImplementation "org.testcontainers:mysql:1.20.1"
    // redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'


    /*JWT 관련 라이브러리*/
    implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
    implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
    implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

    //spring bean validation
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    // mail
    implementation 'org.springframework.boot:spring-boot-starter-mail'

    //swagger
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'

    // QueryDsl
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

    // MongoDB
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb:3.1.8'

    // WebSocket
    implementation 'org.springframework.boot:spring-boot-starter-websocket'

    implementation 'org.springframework.retry:spring-retry'
}

// Querydsl
def generated = 'src/main/generated'

// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

// java source set 에 querydsl QClass 위치 추가
sourceSets {
    main.java.srcDirs += [generated]
}

// gradle clean 시에 QClass 디렉토리 삭제
clean {
    delete file(generated)
}

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