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

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '2.4.0'
    id 'org.jetbrains.kotlin.plugin.allopen' version '2.4.0'
    id 'io.quarkus' version "${quarkusPluginVersion}"
    id 'pmd'
    id 'org.hibernate.orm' version "${hibernateOrmGradlePluginVersion}"
}

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

group = rootProject.group
version = rootProject.version

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.4.0'
    hibernateVersion = '7.4.2.Final'
    jooqVersion = '3.21.6'
}

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
    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 '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.quarkus:quarkus-websockets-next')
    implementation 'io.smallrye.reactive:smallrye-mutiny-vertx-jdbc-client'
    implementation 'io.quarkus:quarkus-mutiny:${quarkusPlatformVersion}'
    implementation 'io.quarkus:quarkus-hibernate-reactive:${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.7.0'
    implementation 'io.quarkus:quarkus-reactive-oracle-client:${quarkusPlatformVersion}'
    implementation 'io.quarkus:quarkus-reactive-mssql-client:${quarkusPlatformVersion}'

    implementation 'io.quarkus:quarkus-reactive-routes:3.36.0'
    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:${jooqVersion}'
    implementation "org.jooq:jooq-codegen-maven:${jooqVersion}"
    implementation 'org.jooq:jooq-meta:${jooqVersion}'
    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}"

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

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

    /* 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.01)
}

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

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')

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

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_25) {
        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_25) {
        jvmArgs += ['--sun-misc-unsafe-memory-access=allow']
    }
    def props = new Properties()
    file('src/main/resources/application.properties').withInputStream { props.load(it) }

    def propDb = props.getProperty('dodex.default.db');
    def useHandicap = props.getProperty('handicap.enable.handicap')

    def handicap = System.getProperty('USE_HANDICAP') ?: System.getenv('USE_HANDICAP') ?: useHandicap
    def db = System.getProperty('DEFAULT_DB') ?: System.getenv('DEFAULT_DB') ?: propDb
    def map = ['DEFAULT_DB' : db, 'USE_HANDICAP' : handicap]

    setEnvironmentVariables(map)

    if (db != null) {
        if ('mssql' == db) {
            System.setProperty('quarkus.hibernate-orm.sqlserver.active', 'true')
            System.setProperty('quarkus.datasource.sqlserver.active', 'true')
        } else if ('oracle' == 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')
        }
    }
}

tasks.withType(KotlinJvmCompile).configureEach {
    compilerOptions {
        jvmTarget.set(JvmTarget.JVM_25)
        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"
}
