import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.DockerPushImage

plugins {
    id 'java'
    id 'io.quarkus'
    id "com.bmuschko.docker-remote-api" version "${dockerPluginVersion}"
    id "com.diffplug.gradle.spotless" version "${spotlessPluginVersion}"
    id "com.github.ben-manes.versions" version "${versionsPluginVersion}"
    id "se.patrikerdes.use-latest-versions" version "${useLatestVersionsPluginVersion}"
}

sourceCompatibility = 11
targetCompatibility = 11

repositories {
     mavenLocal()
     mavenCentral()
}

tasks {
    dependencyUpdates {
        checkConstraints = true
        gradleReleaseChannel = "current"
        revision = "release"
    }
}

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")

    implementation 'io.quarkus:quarkus-agroal'
    implementation 'io.quarkus:quarkus-elytron-security-properties-file'
    implementation 'io.quarkus:quarkus-flyway'
    implementation 'io.quarkus:quarkus-hibernate-orm-panache'
    implementation 'io.quarkus:quarkus-hibernate-validator'
    implementation 'io.quarkus:quarkus-jdbc-postgresql'
    implementation 'io.quarkus:quarkus-kubernetes'
    implementation 'io.quarkus:quarkus-mailer'
    implementation 'io.quarkus:quarkus-oidc'
    implementation 'io.quarkus:quarkus-resteasy'
    implementation 'io.quarkus:quarkus-resteasy-jsonb'
    implementation 'io.quarkus:quarkus-resteasy-qute'
    implementation 'io.quarkus:quarkus-scheduler'
    implementation 'io.quarkus:quarkus-smallrye-jwt'

    //implementation 'io.quarkus:quarkus-elytron-security'
    //implementation 'io.quarkus:quarkus-elytron-security-jdbc'
    //implementation 'io.quarkus:quarkus-elytron-security-oauth2'
    //implementation 'io.quarkus:quarkus-keycloak-authorization'
    //implementation 'io.quarkus:quarkus-quartz'
    //implementation 'io.quarkus:quarkus-smallrye-fault-tolerance'
    //implementation 'io.quarkus:quarkus-smallrye-health'
    //implementation 'io.quarkus:quarkus-smallrye-metrics'
    //implementation 'io.quarkus:quarkus-smallrye-openapi'

    //implementation 'jakarta.transaction:jakarta.transaction-api'
    //implementation 'org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec'
    //implementation 'jakarta.persistence:jakarta.persistence-api'

    implementation "org.bitbucket.b_c:jose4j"

    implementation 'org.mapstruct:mapstruct'
    compileOnly 'org.mapstruct:mapstruct-processor'

    compileOnly 'com.google.code.findbugs:jsr305'

    implementation 'com.vladmihalcea:hibernate-types-52'

    implementation "jakarta.security.jacc:jakarta.security.jacc-api"
    implementation "net.java.dev.jna:jna"

    testImplementation 'io.quarkus:quarkus-junit5'
    testImplementation 'io.rest-assured:rest-assured'

    implementation "com.rometools:rome"
    implementation "com.vladsch.flexmark:flexmark-all"
    implementation "org.jsoup:jsoup"

    constraints {
        implementation "com.vladmihalcea:hibernate-types-52:${hibernateTypesVersion}"
        implementation "org.mapstruct:mapstruct:${mapstructVersion}"
        compileOnly "org.mapstruct:mapstruct-processor:${mapstructVersion}"
        compileOnly "com.google.code.findbugs:jsr305:${findbugsJsr305Version}"
        implementation "jakarta.security.jacc:jakarta.security.jacc-api:${jakartaJaccVersion}"
        implementation "net.java.dev.jna:jna:${jnaVersion}"
        implementation "org.bitbucket.b_c:jose4j:${jose4jVersion}"
        implementation "com.vladsch.flexmark:flexmark-all:${flexmarkVersion}"
        implementation "org.jsoup:jsoup:${jsoupVersion}"
        implementation "com.rometools:rome:${romeVersion}"
    }
}

spotless {
  java {
    googleJavaFormat()
    removeUnusedImports()
  }
}

group "eu.mulk"
version "${projectVersion}"

task yarnInstall(type:Exec) {
  def resourceDir = "src/main/resources/META-INF/resources"

  onlyIf { !project.hasProperty('skipWeb') }

  inputs.file "${resourceDir}/package.json"
  outputs.dir "${resourceDir}/node_modules"
  outputs.file "${resourceDir}/yarn.lock"

  workingDir resourceDir
  commandLine "yarn", "install"
}

task snowpack(type:Exec) {
  def resourceDir = "src/main/resources/META-INF/resources"

  onlyIf { !project.hasProperty('skipWeb') }

  dependsOn yarnInstall

  inputs.dir "${resourceDir}/node_modules"
  inputs.file "${resourceDir}/yarn.lock"
  inputs.file "${resourceDir}/package.json"
  outputs.dir "${resourceDir}/web_modules"

  workingDir resourceDir
  commandLine "yarn", "run", "snowpack", "--optimize"
}

task flow(type:Exec) {
  def resourceDir = "src/main/resources/META-INF/resources"

  onlyIf { !project.hasProperty('skipWeb') }

  dependsOn snowpack

  workingDir resourceDir
  commandLine "yarn", "run", "flow", "--color=always"
}

task eslint(type:Exec) {
  def resourceDir = "src/main/resources/META-INF/resources"

  onlyIf { !project.hasProperty('skipWeb') }

  dependsOn snowpack

  workingDir resourceDir
  commandLine "yarn", "run", "eslint", "cms2", "bookmarks", "--color"
}

task compileWeb {
  dependsOn snowpack
  dependsOn flow
  dependsOn eslint

  doLast {}
}

processResources {
    exclude("META-INF/resources/node_modules/**/*")
    exclude("META-INF/resources/package.json")
    exclude("META-INF/resources/yarn.lock")
}

quarkusBuild.dependsOn compileWeb

task buildDocker(type: DockerBuildImage) {
    onlyIf { !project.hasProperty('skipDocker') }

    inputDir = file(".")
    dockerFile = file("src/main/docker/Dockerfile.jvm")
    images.add("docker.benkard.de/mulk/mulkcms2:${projectVersion}")
}

buildDocker.dependsOn quarkusBuild
assemble.dependsOn buildDocker

task pushDocker(type: DockerPushImage) {
    images.add("docker.benkard.de/mulk/mulkcms2:${projectVersion}")
}

pushDocker.dependsOn buildDocker
