/*
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file 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.
 */

apply plugin: 'maven'
apply plugin: 'signing'
apply plugin: 'maven-publish'

def getVersionName() {
    return isSnapshotBuild() ? VERSION_NAME+".0-SNAPSHOT" : VERSION_NAME
}

version = getVersionName()
group = GROUP

def isSnapshotBuild() {
    return hasProperty('isSnapshot') && project.isSnapshot == "true"
}

def getReleaseRepositoryUrl() {
    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL :
            "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/"
}

def getSnapshotRepositoryUrl() {
    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL :
            "https://ossrh-staging-api.central.sonatype.com/content/repositories/snapshots/"
}

def getRepositoryUsername() {
    return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
    return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
}

archivesBaseName = POM_ARTIFACT_ID

afterEvaluate { project ->
    uploadArchives {
        repositories {
            if (project.hasProperty('SONATYPE_NEXUS_USERNAME')) {
                mavenDeployer {
                    beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                    pom.groupId = GROUP
                    pom.artifactId = POM_ARTIFACT_ID
                    pom.version = getVersionName()

                    name = 'ossrh-staging-api'
                    repository(url: getReleaseRepositoryUrl()) {
                        authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                    }
                    snapshotRepository(url: getSnapshotRepositoryUrl()) {
                        authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                    }

                    pom.project {
                        name POM_NAME
                        packaging POM_PACKAGING
                        description POM_DESCRIPTION
                        url POM_URL

                        scm {
                            url POM_SCM_URL
                            connection POM_SCM_CONNECTION
                            developerConnection POM_SCM_DEV_CONNECTION
                        }

                        licenses {
                            license {
                                name POM_LICENCE_NAME
                                url POM_LICENCE_URL
                                distribution POM_LICENCE_DIST
                            }
                        }

                        developers {
                            developer {
                                id POM_DEVELOPER_ID
                                organizationUrl POM_DEVELOPER_ORGANIZATION_URL
                                roles {
                                    role "developer"
                                }
                            }
                        }
                    }
                }
            } else {
                mavenInstaller {
                    pom.groupId = GROUP
                    pom.artifactId = POM_ARTIFACT_ID
                    pom.version = getVersionName()
                }
            }
        }
    }

    signing {
        required { !isSnapshotBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        if (project.hasProperty('signing.inMemoryKey')) {
            def signingKey = findProperty("signing.inMemoryKey").replace("\\n","\n")
            def signingPassword = findProperty("signing.password")
            def keyId = findProperty("signing.keyId")
            useInMemoryPgpKeys(keyId, signingKey, signingPassword)
        }
        sign configurations.archives
    }

    if (project.getPlugins().hasPlugin('com.android.application') ||
        project.getPlugins().hasPlugin('com.android.library')) {
        task install(type: Upload, dependsOn: assemble) {
            repositories.mavenInstaller {
                configuration = configurations.archives

                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = getVersionName()

                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            organization POM_DEVELOPER_ORGANIZATION
                            organizationUrl POM_DEVELOPER_ORGANIZATION_URL
                        }
                    }
                }
            }
        }

        task androidJavadocs(type: Javadoc) {
            failOnError false
            source = android.sourceSets.main.java.source
            classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        }

        afterEvaluate {
            androidJavadocs.classpath += files(android.libraryVariants.collect { variant ->
                variant.javaCompileProvider.get().classpath.files
            })
        }

        task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
            classifier = 'javadoc'
            from androidJavadocs.destinationDir
        }

        task androidSourcesJar(type: Jar) {
            classifier = 'sources'
            from android.sourceSets.main.java.source
        }
    } else {
        install {
            repositories.mavenInstaller {
                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = getVersionName()

                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            organization POM_DEVELOPER_ORGANIZATION
                            organizationUrl POM_DEVELOPER_ORGANIZATION_URL
                        }
                    }
                }
            }
        }

        task sourcesJar(type: Jar, dependsOn: classes) {
            classifier = 'sources'
            from sourceSets.main.allSource
        }
    }

    artifacts {
        if (project.getPlugins().hasPlugin('com.android.application') ||
            project.getPlugins().hasPlugin('com.android.library')) {
            archives androidSourcesJar
            archives androidJavadocsJar
        } else {
            archives sourcesJar
        }
    }

    publishing {
        publications {
            library(MavenPublication) {
                groupId GROUP
                artifactId POM_ARTIFACT_ID
                version getVersionName()
                artifact("${buildDir}/outputs/aar/${artifactId}-release.aar")
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    // Note that this only handles implementation
                    // dependencies. In the future, may need to add api,
                    // etc.
                    configurations.implementation.allDependencies.each {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
        }
    }
}

