import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

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

allprojects {
    group = "org.embulk"
    version = "0.10.6"
    description = "Inserts or updates records to a table."
}

subprojects {
    apply plugin: 'java'
    apply plugin: "maven-publish"
    apply plugin: "signing"
    apply plugin: "org.embulk.embulk-plugins"
    //apply plugin: 'jacoco'

    repositories {
        mavenCentral()
    }

    configurations {
        defaultJdbcDriver
    }

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

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

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

        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 embulk-core:0.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 embulk-core: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"
        implementation "org.embulk:embulk-util-retryhelper:0.8.2"

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

    test {
    }

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

    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
    }

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

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

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

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

                from components.java  // Must be "components.java". The dependency modification works only for it.

                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-output-jdbc.git"
                        developerConnection = "scm:git:git@github.com:embulk/embulk-output-jdbc.git"
                        url = "https://github.com/embulk/embulk-output-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 {
        sign publishing.publications.maven
    }

    tasks.withType(Test) {
        testLogging {
            // set options for log level LIFECYCLE
            events TestLogEvent.FAILED,
                    TestLogEvent.SKIPPED
            exceptionFormat TestExceptionFormat.FULL
            showExceptions true
            showCauses true
            showStackTraces true

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