import com.github.spotbugs.snom.Confidence
import com.github.spotbugs.snom.Effort
import com.github.spotbugs.snom.SpotBugsTask
import org.hidetake.gradle.swagger.generator.GenerateSwaggerCode

repositories {
    mavenCentral()
}

plugins {
    java
    checkstyle
    id("com.github.spotbugs") version "6.0.23"
    id("org.springframework.boot") version "3.4.2"
    id("io.spring.dependency-management") version "1.1.7"
    id("org.hidetake.swagger.generator") version "2.19.2"
}

checkstyle {
    toolVersion = "10.21.2"
    configDirectory = file("src/main/resources/")
    configFile = file("src/main/resources/checkstyle.xml")
}

spotbugs {
    toolVersion = "4.8.6"
    effort.set(Effort.MAX)
    reportLevel.set(Confidence.LOW)
}

group = "de.towerdefence"

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

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

dependencies {
    // Spring
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-websocket")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
    implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server")
    developmentOnly("org.springframework.boot:spring-boot-devtools")

    // Postgres
    runtimeOnly("org.postgresql:postgresql")

    // Lombok
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")

    // Test
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.boot:spring-boot-testcontainers")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:postgresql")
    testRuntimeOnly("com.h2database:h2")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    //OAS
    swaggerCodegen("io.swagger.codegen.v3:swagger-codegen-cli:3.0.61")
    implementation("io.swagger.core.v3:swagger-annotations:2.2.22")
    implementation("jakarta.xml.bind:jakarta.xml.bind-api") //Needed for XML/HTML Validation
}

tasks.withType<Test> {
    useJUnitPlatform()
}

swaggerSources {
    register("api") {
        setInputFile(file("${rootDir}/api/api.yml"))
        code.configFile = file("${rootDir}/api/gen-config.json")
        val validationTask = validation
        code(delegateClosureOf<GenerateSwaggerCode> {
            language = "spring"
            code.rawOptions =
                listOf("--ignore-file-override=" + file("${rootDir}/api/.gen-ignore").absolutePath)
            dependsOn(validationTask)
        })
    }
}



tasks {
    withType<Checkstyle> {
        reports {
            xml.required.set(true)
            html.required.set(false)
        }
    }
    withType<SpotBugsTask> {
        excludeFilter.set(file("${rootDir}/src/main/resources/spotbugs-exclude.xml"))
    }
    processResources {
        dependsOn(generateSwaggerCode)
    }
    withType<Test> {
        useJUnitPlatform()
    }
    named("compileJava").configure {
        dependsOn(swaggerSources.getByName("api").code)
    }

}

sourceSets {
    main {
        java.srcDir("${swaggerSources.getByName("api").code.outputDir}/src/main/java")
        resources.srcDir("${swaggerSources.getByName("api").code.outputDir}/src/main/resources")
    }
}