/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

apply(plugin: "maven")
apply(plugin: "signing")

ext {
    AAR_OUTPUT_URL = "file://${projectDir}/../android"
}

// Gradle tasks for publishing to maven
// 1) To install in local maven repo use :installArchives task
// 2) To upload artifact to maven central use: :uploadArchives (you'd need to have the permission to do that)

def isReleaseBuild() {
    return VERSION_NAME.contains("SNAPSHOT") == false
}

def getRepositoryUrl() {
    return project.findProperty("repositoryUrl") ?: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def getRepositoryUsername() {
    return project.findProperty("repositoryUsername") ?: ""
}

def getRepositoryPassword() {
    return project.findProperty("repositoryPassword") ?: ""
}

def configureReactNativePom(def pom) {
    pom.project {
        name(POM_NAME)
        artifactId(POM_ARTIFACT_ID)
        packaging(POM_PACKAGING)
        description("A framework for building native apps with React")
        url("https://github.com/facebook/react-native")

        scm {
            url("https://github.com/facebook/react-native.git")
            connection("scm:git:https://github.com/facebook/react-native.git")
            developerConnection("scm:git:git@github.com:facebook/react-native.git")
        }

        licenses {
            license {
                name("MIT License")
                url("https://github.com/facebook/react-native/blob/master/LICENSE")
                distribution("repo")
            }
        }

        developers {
            developer {
                id("facebook")
                name("Facebook")
            }
        }
    }
}

if (JavaVersion.current().isJava8Compatible()) {
    allprojects {
        tasks.withType(Javadoc) {
            options.addStringOption("Xdoclint:none", "-quiet")
        }
    }
}

afterEvaluate { project ->

    task androidJavadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += files(android.bootClasspath)
        classpath += files(project.getConfigurations().getByName("compile").asList())
        include("**/*.java")
        exclude("**/ReactBuildConfig.java")
    }

    task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
        classifier = "javadoc"
        from(androidJavadoc.destinationDir)
    }

    task androidSourcesJar(type: Jar) {
        classifier = "sources"
        from(android.sourceSets.main.java.srcDirs)
        include("**/*.java")
    }

    android.libraryVariants.all { variant ->
        def name = variant.name.capitalize()
        task "jar${name}"(type: Jar, dependsOn: variant.javaCompileProvider.get()) {
            from(variant.javaCompileProvider.get().destinationDir)
        }
    }

    artifacts {
        archives(androidSourcesJar)
        archives(androidJavadocJar)
    }

    version = VERSION_NAME
    group = GROUP

    signing {
        required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        sign(configurations.archives)
    }

    uploadArchives {
        configuration = configurations.archives
        repositories.mavenDeployer {
            beforeDeployment {
                MavenDeployment deployment -> signing.signPom(deployment)
            }

            repository(url: getRepositoryUrl()) {
                authentication(
                        userName: getRepositoryUsername(),
                        password: getRepositoryPassword())

            }

            configureReactNativePom(pom)
        }
    }

    task installArchives(type: Upload) {
        configuration = configurations.archives
        repositories.mavenDeployer {
            // Deploy to react-native/android, ready to publish to npm
            repository(url: AAR_OUTPUT_URL)

            configureReactNativePom(pom)
        }
    }
}