import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile

plugins {
    id 'java'
    id "org.jetbrains.kotlin.jvm" version "2.3.20"
    id "org.jetbrains.kotlin.plugin.allopen" version "2.3.20"
    id "io.quarkus" version "${quarkusPluginVersion}"
    id "pmd"
    id "org.hibernate.orm" version "${hibernateOrmGradlePluginVersion}"
//    id "org.kordamp.gradle.jandex" version "2.2.0"
}

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(25))
    }
    compilerOptions.jvmTarget.set(JvmTarget.JVM_24)
}

repositories {
    mavenCentral()
    maven {
        url = "https://maven.cubrid.org/"
    }
}

group = 'dmo.fs'
version = '3.20.0'

pmd {
    ruleSetFiles = files(["../dodexstart.xml"])
    ruleSets = []
    ignoreFailures = true
    toolVersion = "7.13.0"
    consoleOutput = false
    rulesMinimumPriority = 3
}

ext {
    vertxVersion = "4.5.26"
    javaMainClass = "dmo.fs.db.handicap.utils.JooqGenerate"
    kotlin_version = "2.3.20"
    hibernateVersion = "7.2.5.Final"
}

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
//    implementation 'org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:1.0.0'
    implementation "io.quarkus:quarkus-smallrye-openapi"
    implementation "io.quarkus:quarkus-rest-jackson"
    implementation "io.vertx:vertx-rx-java3:$vertxVersion"
    implementation "io.quarkus:quarkus-rest"
//    implementation "io.quarkus:quarkus-resteasy-reactive:3.15.7"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "io.quarkus:quarkus-grpc:${quarkusPlatformVersion}"
    implementation "com.google.protobuf:protobuf-kotlin:4.34.0"

    implementation "io.quarkus:quarkus-kotlin"

    implementation "io.smallrye.reactive:smallrye-mutiny-vertx-jdbc-client"
    implementation "io.quarkus:quarkus-mutiny:${quarkusPlatformVersion}"
    implementation("io.quarkus:quarkus-hibernate-reactive:${quarkusPlatformVersion}")
//    implementation "io.quarkus:quarkus-hibernate-reactive-panache:${quarkusPlatformVersion}"

    implementation "io.vertx:vertx-jdbc-client:$vertxVersion"
    implementation "io.quarkus:quarkus-reactive-mysql-client"
    implementation "io.quarkus:quarkus-reactive-pg-client"
    implementation "io.quarkus:quarkus-reactive-db2-client"
    implementation "io.quarkiverse.neo4j:quarkus-neo4j:6.5.0"
    implementation "io.quarkus:quarkus-reactive-oracle-client:${quarkusPlatformVersion}"
    implementation "io.quarkus:quarkus-reactive-mssql-client:${quarkusPlatformVersion}"

    implementation "io.quarkus:quarkus-vertx-web:3.0.0.Beta1"
    implementation "io.quarkus:quarkus-vertx:${quarkusPlatformVersion}"

    implementation "io.quarkus:quarkus-vertx-http"
    implementation "io.quarkus:quarkus-messaging-kafka"
    implementation "org.apache.kafka:kafka-clients"
    implementation("org.jooq:jooq:3.21.1")
    implementation("org.jooq:jooq-codegen-maven:3.21.1")
    implementation("org.jooq:jooq-meta:3.21.1")
    implementation("jakarta.xml.bind:jakarta.xml.bind-api")
    implementation "io.quarkus:quarkus-jdbc-h2:${quarkusPlatformVersion}"
    implementation "io.quarkus:quarkus-jdbc-mariadb:${quarkusPlatformVersion}"
    implementation "io.quarkus:quarkus-jdbc-postgresql:${quarkusPlatformVersion}"
    implementation "io.quarkus:quarkus-jdbc-db2:${quarkusPlatformVersion}"
    implementation "cubrid:cubrid-jdbc:11.2.1.0038"
    implementation "io.vertx:vertx-rx-java2:$vertxVersion"
    implementation "io.quarkus:quarkus-smallrye-health"
    implementation "io.vertx:vertx-tcp-eventbus-bridge:$vertxVersion"
    implementation "com.google.firebase:firebase-admin:9.7.0"
    implementation "com.google.guava:guava:33.5.0-jre"
    compileOnly 'jakarta.persistence:jakarta.persistence-api:3.2.0'
    annotationProcessor("org.hibernate.orm:hibernate-jpamodelgen:$hibernateVersion")

    /* You can test LGTM with these dependencies, also see application.properties */
//    implementation("io.quarkus:quarkus-observability-devservices-lgtm")
//    implementation("io.quarkiverse.micrometer.registry:quarkus-micrometer-registry-otlp:3.2.4")
//    implementation("io.quarkus:quarkus-opentelemetry")
//    implementation("io.opentelemetry:opentelemetry-exporter-logging:1.43.0")

    implementation(project(':dodex-db'))
    implementation(project(':generate'))

    testImplementation "io.quarkus:quarkus-junit5:${quarkusPlatformVersion}"
    testImplementation "io.rest-assured:rest-assured"

    implementation("io.quarkus:quarkus-websockets-next")

}

java {
    sourceCompatibility = JavaVersion.VERSION_24
    targetCompatibility = JavaVersion.VERSION_24
}

println("Java Version*: " + JavaVersion.current() + " -- target: " + java.targetCompatibility)

def usr = System.getProperty("user.home")
def OS = System.getProperty("os.name").toLowerCase()
def dir = System.getProperty("user.dir")
def db = System.getProperty("DEFAULT_DB")

if ("mssql" == System.getenv("DEFAULT_DB")) {
    System.setProperty('quarkus.hibernate-orm.sqlserver.active', "true")
    System.setProperty('quarkus.datasource.sqlserver.active', "true")
} else if ("oracle" == System.getenv("DEFAULT_DB")) {
    System.setProperty('quarkus.hibernate-orm.oracle.active', "true")
    System.setProperty('quarkus.datasource.oracle.active', "true")
} else {
    System.setProperty('quarkus.hibernate-orm.sqlserver.active', "false")
    System.setProperty('quarkus.datasource.sqlserver.active', "false")
    System.setProperty('quarkus.hibernate-orm.oracle.active', "false")
    System.setProperty('quarkus.datasource.oracle.active', "false")
}

compileJava {
    options.encoding = "UTF-8"
//	    options.compilerArgs += "-Xlint:unchecked,deprecation"
}

tasks.withType(JavaExec).configureEach {
    jvmArgs += ["--enable-native-access=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED"]

    if (JavaVersion.current() >= JavaVersion.VERSION_24) {
        jvmArgs += ["--sun-misc-unsafe-memory-access=allow"]
    }
}

tasks.quarkusDev {
    jvmArgs += ["--enable-native-access=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED"]
    if (JavaVersion.current() >= JavaVersion.VERSION_24) {
        jvmArgs += ["--sun-misc-unsafe-memory-access=allow"]
    }
}

tasks.withType(KotlinJvmCompile).configureEach {
    compilerOptions {
        jvmTarget.set(JvmTarget.JVM_24)
        freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn")
    }
}

/*
  Using a java class to generate jooq objects - allows for multiple db's - see ./generate directory
  Composite build - implementation("dmo.fs.utils:generate:0.0.1") - this avoids the circular dependency error
*/
tasks.register('jooqGenerate', JavaExec) {
    group = "Execution"
    doFirst {
        classpath = sourceSets.main.runtimeClasspath
    }

    def defaultDb = System.getenv("DEFAULT_DB") ?: "sqlite3"
    defaultDb = defaultDb == "sqlite3" || defaultDb == "postgres" ? defaultDb : "sqlite3"

    environment "DEFAULT_DB", defaultDb
    environment "VERTXWEB_ENVIRONMENT", "dev"
    mainClass = "dmo.fs.db.generate.utils.JooqGenerate"
    args = ["dev"]
}

/*
    The "run" task can be used to set Environment Variables before executing "quarkusDev"
 */
tasks.register('run', Exec) {
    //   workingDir dir
    if ("firebase" == System.getenv("DEFAULT_DB") && System.getenv("GOOGLE_APPLICATION_CREDENTIALS") == null) {
        environment "GOOGLE_APPLICATION_CREDENTIALS", "$usr/auth/service-account-key.json"
    }
    //on windows:
    if (OS.indexOf("win") >= 0) {
        commandLine "cmd", "/c", ".\\gradlew", "quarkusDev"
    } else {
        //on linux
        commandLine "./gradlew", "quarkusDev"
    }
    // dependsOn gradle.includedBuild("generate").task(":build")
}

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

compileTestJava {
    options.encoding = 'UTF-8'
    options.compilerArgs << "-Xlint:unchecked"
}

test {
    useJUnitPlatform()
    testLogging {
        events = ["PASSED", "FAILED", "SKIPPED"]
    }
}

quarkus {
    quarkusBuildProperties.put("quarkus.grpc.codegen.proto-directory", "${project.projectDir}/src/main/proto")
}
