/*
 * Copyright 2021 DataCanvas
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

plugins {
    id 'application'
    id 'java-conventions'
    id 'java-library'
    id "com.gorylenko.gradle-git-properties" version "${gradleGitCommitVersion}"
    id 'maven-publish'
    id 'signing'
}

application {
    applicationDefaultJvmArgs = ["--add-opens", "java.base/java.util=ALL-UNNAMED"]
}

dependencies {
    annotationProcessor group: 'com.google.auto.service', name: 'auto-service', version: 'auto-service'.v()
    compileOnly group: 'com.google.auto.service', name: 'auto-service', version: 'auto-service'.v()
    implementation group: 'org.apache.calcite.avatica', name: 'avatica-core', version: 'avatica'.v()
    implementation project(':dingo-common')
    implementation project(':dingo-net-api')
    implementation project(':dingo-net-netty')
    implementation project(':dingo-verify')
    implementation project(':dingo-calcite')
    implementation project(":dingo-driver:dingo-driver-common")
}

tasks.register('javadocJar', Jar) {
    classifier 'javadoc'
    from javadoc
}

tasks.register('sourcesJar', Jar) {
    classifier 'sources'
    from sourceSets.main.allSource
}

tasks.register('fatJar', Jar) {
    classifier 'all'
    from(
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) },
    )
    with jar

    // Register dingo driver
    metaInf {
        from "src/main/resources/java.sql.Driver"
        into "services"
    }

    exclude "META-INF/*.SF"
    exclude "META-INF/*.DSA"
    exclude "META-INF/*.RSA"
    // Remove register of avatica driver
    exclude "META-INF/services/java.sql.Driver"
}

tasks.withType(Jar).configureEach {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

fatJar.dependsOn([
        ':dingo-common:jar',
        ':dingo-net-api:jar',
        ':dingo-net-netty:jar',
        ':dingo-serial:jar',
        ':dingo-verify:jar',
        ':dingo-calcite:jar',
        ":dingo-driver:dingo-driver-common:jar",
        ':dingo-cluster-api:jar',
        ':dingo-codec-api:jar',
        ':dingo-exec:jar',
        ':dingo-meta-api:jar',
        ':dingo-partition-api:jar',
        ':dingo-store-api:jar',
        ':dingo-tool-api:jar',
        ':dingo-transaction-api:jar',
        ':dingo-tso-api:jar'
])

tasks.named("build") { x ->
    x.finalizedBy("fatJar")
}

publishing {
    repositories {
        maven {
            name = "OSSRH"
            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            /**
             * will manually release the artifactory
             */
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl;
            credentials {
                username = System.getenv("MAVEN_USERNAME") != null ? System.getenv("MAVEN_USERNAME") : project.findProperty("ossrhUsername")
                password = System.getenv("MAVEN_TOKEN") != null ? System.getenv("MAVEN_TOKEN") : project.findProperty("ossrhPassword")
            }
        }
    }

    publications {
        maven(MavenPublication) {
            groupId = 'io.dingodb'
            artifactId = 'dingo-driver-client'
            artifacts = [fatJar, sourcesJar, javadocJar]
        }
        maven(MavenPublication) {
            pom {
                name = 'dingo-driver-client'
                packaging = 'jar'
                // optionally artifactId can be defined here
                description = 'A driver client for dingo cluster'
                url = 'http://www.dingodb.datacanvas.com/'

                scm {
                    connection = 'scm:svn:http://foo.googlecode.com/svn/trunk/'
                    developerConnection = 'scm:svn:https://foo.googlecode.com/svn/trunk/'
                    url = 'http://foo.googlecode.com/svn/trunk/'
                }

                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                developers {
                    developer {
                        id = 'dingodb'
                        name = 'DingoDB develop team'
                        email = 'dingodb@zetyun.com'
                    }
                }
            }
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.each {
                    if (!it.name.startsWith('dingo')) {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
            if (!version.endsWith("SNAPSHOT")) {
                   signing {
                           sign publishing.publications.maven
                   }
            }
        }
    }
}


project.gradle.taskGraph.whenReady { graph ->
    project.tasks.findAll().forEach { task ->
        if (task.name.contains("signArchives")) {
            task.enabled = false
        }
    }
}
