plugins {
    id "java"
    id "maven-publish"
    id "signing"
    id "checkstyle"
    id "org.embulk.embulk-plugins" version "0.7.0" apply false
}

allprojects {
    group = "org.embulk"
    version = "0.14.0"
    description = "Selects records from a table."
}

subprojects {
    apply plugin: "java"
    apply plugin: "maven-publish"
    apply plugin: "signing"
    apply plugin: "checkstyle"
    apply plugin: "org.embulk.embulk-plugins"

    repositories {
        mavenCentral()
    }

    configurations {
        defaultJdbcDriver
        compileClasspath.resolutionStrategy.activateDependencyLocking()
        runtimeClasspath.resolutionStrategy.activateDependencyLocking()
    }

    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
        options.encoding = "UTF-8"
    }

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

        withJavadocJar()
        withSourcesJar()
    }

    dependencies {
        compileOnly "org.embulk:embulk-spi:0.11"

        implementation("org.embulk:embulk-util-config:0.3.4") {
            // They conflict with embulk-core. They are once excluded here,
            // and added explicitly with versions exactly the same with older embulk-core (until v0.10.31).
            exclude group: "com.fasterxml.jackson.core", module: "jackson-annotations"
            exclude group: "com.fasterxml.jackson.core", module: "jackson-core"
            exclude group: "com.fasterxml.jackson.core", module: "jackson-databind"
            exclude group: "com.fasterxml.jackson.datatype", module: "jackson-datatype-jdk8"
            exclude group: "javax.validation", module: "validation-api"
        }

        // They are once excluded from transitive dependencies of other dependencies,
        // and added explicitly with versions exactly the same with older embulk-core (until 0.10.31).
        implementation "com.fasterxml.jackson.core:jackson-annotations:2.6.7"
        implementation "com.fasterxml.jackson.core:jackson-core:2.6.7"
        implementation "com.fasterxml.jackson.core:jackson-databind:2.6.7.5"
        implementation "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.6.7"
        implementation "javax.validation:validation-api:1.1.0.Final"

        implementation "org.embulk:embulk-util-json:0.3.0"
        implementation "org.embulk:embulk-util-timestamp:0.2.2"

        testImplementation "org.embulk:embulk-junit4:0.11.1"
        testImplementation "org.embulk:embulk-core:0.11.1"
        testImplementation "org.embulk:embulk-deps:0.11.1"
    }

    javadoc {
        options {
            locale = 'en_US'
            encoding = 'UTF-8'
        }
    }

    // A safer and strict alternative to: "dependencies" (and "dependencies --write-locks")
    //
    // This task fails explicitly when the specified dependency is not available.
    // In contrast, "dependencies (--write-locks)" does not fail even when a part the dependencies are unavailable.
    //
    // https://docs.gradle.org/8.13/userguide/dependency_locking.html#generating_and_updating_dependency_locks
    task checkDependencies {
        notCompatibleWithConfigurationCache("The task \"checkDependencies\" filters configurations at execution time.")
        doLast {
            configurations.findAll { it.canBeResolved }.each { it.resolve() }
        }
    }

    // It should not publish a `.module` file in Maven Central.
    // https://docs.gradle.org/current/userguide/publishing_gradle_module_metadata.html#sub:disabling-gmm-publication
    tasks.withType(GenerateModuleMetadata) {
        enabled = false
    }

    publishing {
        publications {
            maven(MavenPublication) {
                afterEvaluate { project ->
                    groupId = "${project.group}"
                    artifactId = "${project.name}"
                }

                from components.java

                pom {  // https://central.sonatype.org/pages/requirements.html
                    packaging "jar"

                    afterEvaluate { project ->
                        name = "${project.name}"
                        description = "${project.description}"
                    }
                    url = "https://www.embulk.org/"

                    licenses {
                        license {
                            // http://central.sonatype.org/pages/requirements.html#license-information
                            name = "The Apache License, Version 2.0"
                            url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
                            distribution = "repo"
                        }
                    }

                    // "developers" section is written in each subproject.

                    scm {
                        connection = "scm:git:git://github.com/embulk/embulk-input-jdbc.git"
                        developerConnection = "scm:git:git@github.com:embulk/embulk-input-jdbc.git"
                        url = "https://github.com/embulk/embulk-input-jdbc"
                    }
                }
            }
        }

        repositories {
            maven {  // publishMavenPublicationToMavenCentralRepository
                name = "mavenCentral"
                if (project.version.endsWith("-SNAPSHOT")) {
                    url "https://oss.sonatype.org/content/repositories/snapshots"
                } else {
                    url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
                }

                credentials {
                    username = project.hasProperty("ossrhUsername") ? ossrhUsername : ""
                    password = project.hasProperty("ossrhPassword") ? ossrhPassword : ""
                }
            }
        }
    }

    signing {
        if (project.hasProperty("signingKey") && project.hasProperty("signingPassword")) {
            logger.lifecycle("Signing with an in-memory key.")
            useInMemoryPgpKeys(signingKey, signingPassword)
        }
        sign publishing.publications.maven
    }

    gem {
        authors = [ "Sadayuki Furuhashi" ]
        email = [ "frsyuki@gmail.com" ]
        summary = "JDBC input plugin for Embulk"
        homepage = "https://github.com/embulk/embulk-input-jdbc"
        licenses = [ "Apache-2.0" ]

        into("default_jdbc_driver") {
            from configurations.defaultJdbcDriver
        }
    }

    gemPush {
        host = "https://rubygems.org"
    }

    test {
        // JDBC input plugins depend on local time zone to parse timestamp without time stamp and datetime types.
        jvmArgs "-Duser.country=FI", "-Duser.timezone=Europe/Helsinki"
        environment "TZ", "Europe/Helsinki"
    }

    tasks.withType(Test) {
        testLogging {
            // set options for log level LIFECYCLE
            events "passed", "skipped", "failed", "standardOut", "standardError"
            exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
            showCauses = true
            showExceptions = true
            showStackTraces = true
            showStandardStreams = true

            outputs.upToDateWhen { false }

            afterSuite { desc, result ->
                if (!desc.parent) { // will match the outermost suite
                    def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
                    def startItem = '|  ', endItem = '  |'
                    def repeatLength = startItem.length() + output.length() + endItem.length()
                    println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
                }
            }
        }
    }

    checkstyle {
        configFile = file("${project.rootDir}/config/checkstyle/checkstyle.xml")
        toolVersion = '6.14.1'
    }
    checkstyleMain {
        configFile = file("${project.rootDir}/config/checkstyle/default.xml")
        ignoreFailures = true
    }
    checkstyleTest {
        configFile = file("${project.rootDir}/config/checkstyle/default.xml")
        ignoreFailures = true
    }
    task checkstyle(type: Checkstyle) {
        classpath = sourceSets.main.output + sourceSets.test.output
        source = sourceSets.main.allJava + sourceSets.test.allJava
    }
}
