buildscript {
    ext.android_tools = 'com.android.tools.build:gradle:3.1.3'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // This must be applied in the root project otherwise each subproject will
        // have it in a different ClassLoader.
        classpath android_tools
    }
}

plugins {
  // Add dependency for build script so we can access Git from our
  // build script.
  id 'org.ajoberstar.grgit' version '2.2.1'
  id 'net.ltgt.errorprone' version '0.0.11'
}

subprojects {
    def androidProject = ((project.name == 'conscrypt-android')
            || (project.name == 'conscrypt-android-platform')
            || (project.name == 'conscrypt-benchmark-android')
            || (project.name == 'conscrypt-benchmark-caliper'))
    if (androidProject) {
        repositories {
            google()
        }
    } else {
        apply plugin: 'java-library'
        apply plugin: 'cpp'

        model {
            toolChains {
                visualCpp(VisualCpp)
                // Prefer Clang over Gcc (order here matters!)
                clang(Clang)
                gcc(Gcc)
            }
        }
    }
    apply plugin: "maven"
    apply plugin: "signing"
    apply plugin: "idea"
    apply plugin: "jacoco"
    apply plugin: "net.ltgt.errorprone"

    group = "org.conscrypt"
    description = 'Conscrypt is an alternate Java Security Provider that uses BoringSSL'
    version = "2.1.0-SNAPSHOT"

    ext {
        os = org.gradle.internal.os.OperatingSystem.current();
        if (os.isLinux()) {
            osName = "linux"
        } else if (os.isMacOsX()) {
            osName = "osx"
        } else if (os.isWindows()) {
            osName = "windows"
        } else {
            throw new GradleException("Unsupported os: " + os.name)
        }

        if (project.hasProperty("boringsslHome")) {
            boringsslHome = project.property("boringsslHome")
        } else {
            boringsslHome = "$System.env.BORINGSSL_HOME"
        }

        boringsslIncludeDir = normalizePath("$boringsslHome/include")
        boringssl32BuildDir = normalizePath("$boringsslHome/build32")
        boringssl64BuildDir = normalizePath("$boringsslHome/build64")

        if (project.hasProperty("jdkHome")) {
            jdkHome = project.property("jdkHome")
        } else {
            jdkHome = "$System.env.JAVA_HOME"
        }
        jdkIncludeDir = normalizePath("$jdkHome/include")
        // Needs to be binary compatible with androidMinSdkVersion
        androidMinJavaVersion = JavaVersion.VERSION_1_7

        build32Bit = file("$boringssl32BuildDir").exists()
        build64Bit = file("$boringssl64BuildDir").exists()

        // Ensure the environment is configured properly.
        assert file("$boringsslHome").exists()
        assert file("$boringsslIncludeDir").exists()
        assert build32Bit || build64Bit
        assert file("$jdkHome").exists()
        assert file("$jdkIncludeDir").exists()

        // Get the commit hash for BoringSSL.
        boringSslGit = org.ajoberstar.grgit.Grgit.open(dir: boringsslHome)
        boringSslVersion = boringSslGit.head().id

        // Allow the java executable to be specified via env/property for each architecture.
        javaExecutable32 = System.getProperty('javaExecutable32', System.env.CONSCRYPT_JAVA_EXECUTABLE_32)
        javaExecutable64 = System.getProperty('javaExecutable64', System.env.CONSCRYPT_JAVA_EXECUTABLE_64)

        jmhVersion = '1.19'
        libraries = [
                android_tools: android_tools,
                roboelectric: 'org.robolectric:android-all:7.1.0_r7-robolectric-0',

                // Test dependencies.
                bouncycastle_apis: 'org.bouncycastle:bcpkix-jdk15on:1.56',
                bouncycastle_provider: 'org.bouncycastle:bcprov-jdk15on:1.56',
                junit  : 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                truth  : 'com.google.truth:truth:0.28',

                // Benchmark dependencies
                jmh_core: "org.openjdk.jmh:jmh-core:${jmhVersion}",
                jmh_generator_annprocess: "org.openjdk.jmh:jmh-generator-annprocess:${jmhVersion}",
                jmh_generator_asm: "org.openjdk.jmh:jmh-generator-asm:${jmhVersion}",
                jmh_generator_bytecode: "org.openjdk.jmh:jmh-generator-bytecode:${jmhVersion}",
                jmh_generator_reflection: "org.openjdk.jmh:jmh-generator-reflection:${jmhVersion}",
                netty_handler: 'io.netty:netty-handler:4.1.8.Final',
                netty_tcnative: 'io.netty:netty-tcnative-boringssl-static:1.1.33.Fork26',
        ]

        signJar = { jarPath ->
            if (rootProject.hasProperty('signingKeystore') && rootProject.hasProperty('signingPassword')) {
                def command = 'jarsigner -keystore ' + rootProject.signingKeystore +
                        ' -storepass ' + rootProject.signingPassword +
                        ' ' + jarPath + ' signingcert'
                def process = command.execute()
                process.waitFor()
                if (process.exitValue()) {
                    throw new GradleException('Jar signing failed for ' + jarPath + ': ' + process.text)
                }
            }
        }
    }

    repositories {
        mavenCentral()
        mavenLocal()
        jcenter()
    }

    signing {
        required false
        sign configurations.archives
    }

    signArchives.doFirst {
        configurations.archives.allArtifacts.each {
            if (it.type == 'jar' && it.classifier != 'sources' && it.classifier != 'javadoc') {
                signJar(it.file.absolutePath)
            }
        }
    }

    task generateProperties(type: WriteProperties) {
        ext {
            parsedVersion = VersionNumber.parse(version)
        }
        property("org.conscrypt.version.major", parsedVersion.getMajor())
        property("org.conscrypt.version.minor", parsedVersion.getMinor())
        property("org.conscrypt.version.patch", parsedVersion.getMicro())
        property("org.conscrypt.boringssl.version", boringSslVersion)
        outputFile "build/generated/resources/org/conscrypt/conscrypt.properties"
    }

    if (!androidProject) {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7

        [compileJava, compileTestJava].each() {
            it.options.compilerArgs += ["-Xlint:all", "-Xlint:-options", '-Xmaxwarns', '9999999']
            it.options.encoding = "UTF-8"
            if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) {
                it.options.compilerArgs += ["-Werror"]
            }
        }

        compileTestJava {
            // serialVersionUID is basically guaranteed to be useless in our tests
            options.compilerArgs += ["-Xlint:-serial"]
        }

        jar.manifest {
            attributes('Implementation-Title': name,
                    'Implementation-Version': version,
                    'Built-By': System.getProperty('user.name'),
                    'Built-JDK': System.getProperty('java.version'),
                    'Source-Compatibility': sourceCompatibility,
                    'Target-Compatibility': targetCompatibility)
        }

        javadoc.options {
            encoding = 'UTF-8'
            links 'https://docs.oracle.com/javase/8/docs/api/'
        }

        // Disable JavaDoc doclint on Java 8. It's annoying.
        if (JavaVersion.current().isJava8Compatible()) {
            allprojects {
                tasks.withType(Javadoc) {
                    options.addStringOption('Xdoclint:none', '-quiet')
                }
            }
        }

        task javadocJar(type: Jar) {
            classifier = 'javadoc'
            from javadoc
        }

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

        artifacts {
            archives sourcesJar
            archives javadocJar
        }

        uploadArchives.repositories.mavenDeployer {
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
            String stagingUrl
            if (rootProject.hasProperty('repositoryId')) {
                stagingUrl = 'https://oss.sonatype.org/service/local/staging/deployByRepositoryId/' +
                        rootProject.repositoryId
            } else {
                stagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
            }
            def configureAuth = {
                if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                    authentication(userName: rootProject.ossrhUsername, password: rootProject.ossrhPassword)
                }
            }
            repository(url: stagingUrl, configureAuth)
            snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth)
        }

        [
                install.repositories.mavenInstaller,
                uploadArchives.repositories.mavenDeployer,
        ]*.pom*.whenConfigured { pom ->
            pom.project {
                name "$project.group:$project.name"
                description project.description
                url 'https://conscrypt.org/'

                scm {
                    connection 'scm:git:https://github.com/google/conscrypt.git'
                    developerConnection 'scm:git:git@github.com:google/conscrypt.git'
                    url 'https://github.com/google/conscrypt'
                }

                licenses {
                    license {
                        name 'Apache 2'
                        url 'https://www.apache.org/licenses/LICENSE-2.0'
                    }
                }

                developers {
                    developer {
                        id "conscrypt"
                        name "Conscrypt Contributors"
                        email "conscrypt@googlegroups.com"
                        url "https://conscrypt.org/"
                        organization = "Google, Inc."
                        organizationUrl "https://www.google.com"
                    }
                }
            }
        }

        // At a test failure, log the stack trace to the console so that we don't
        // have to open the HTML in a browser.
        test {
            testLogging {
                exceptionFormat = 'full'
                showExceptions true
                showCauses true
                showStackTraces true
                showStandardStreams = true
            }
            // Enable logging for all conscrypt classes while running tests.
            systemProperty 'java.util.logging.config.file', "${rootDir}/test_logging.properties"
            maxHeapSize = '1500m'

            // Override the default executable if manually specified
            if (build64Bit && javaExecutable64 != null) {
                executable javaExecutable64
            } else if (build32Bit && javaExecutable32 != null) {
                executable javaExecutable32
            }
        }
    }
}

static String normalizePath(path) {
    new File(path.toString()).absolutePath
}
