/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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.
 */

import androidx.build.BuildServerConfigurationKt
import androidx.build.dependencyTracker.AffectedModuleDetector
import androidx.build.gmaven.GMavenVersionChecker
import androidx.build.jacoco.Jacoco

def supportRoot = ext.supportRootFolder
if (supportRoot == null) {
    throw new RuntimeException("variable supportRootFolder is not set. you must set it before" +
            " including this script")
}
def init = new Properties()
ext.init = init
rootProject.ext.versionChecker = new GMavenVersionChecker(rootProject.logger)
apply from: "${supportRoot}/buildSrc/dependencies.gradle"

def setupRepoOutAndBuildNumber() {
    /*
     * The OUT_DIR is a temporary directory you can use to put things during the build.
     */
    if (BuildServerConfigurationKt.isRunningOnBuildServer()) {
        buildDir = new File(System.env.OUT_DIR + '/gradle/frameworks/support/build')
                .getCanonicalFile()
        // the build server should always print out full stack traces for any failures.
        gradle.startParameter.showStacktrace = ShowStacktrace.ALWAYS
    } else {
        buildDir = file("${ext.supportRootFolder}/../../out/host/gradle/frameworks/support/build")
    }
    subprojects {
        // Change buildDir first so that all plugins pick up the new value.
        project.buildDir = new File("$project.parent.buildDir/../$project.name/build")
    }
    ext.supportRepoOut = new File(buildDir, 'support_repo')
    ext.supportRepoOut.mkdirs()
    ext.docsDir = new File(buildDir, 'javadoc')
}

def configureSubProjects() {
    subprojects {
        repos.addMavenRepositories(repositories)
    }
    setupSubprojectsForBuildServer()
}
def setupSubprojectsForBuildServer() {
    subprojects {
        project.plugins.whenPluginAdded { plugin ->
            def isAndroidLibrary = "com.android.build.gradle.LibraryPlugin"
                    .equals(plugin.class.name)
            def isAndroidApp = "com.android.build.gradle.AppPlugin".equals(plugin.class.name)

            if (isAndroidLibrary || isAndroidApp) {
                // Copy the class files in a jar to be later used to generate code coverage report
                project.android.testVariants.all { v ->
                    // check if the variant has any source files
                    // and test coverage is enabled
                    if (v.buildType.testCoverageEnabled
                            && v.sourceSets.any { !it.java.sourceFiles.isEmpty() }) {
                        def jarifyTask = project.tasks.register(
                                "package${v.name.capitalize()}ClassFilesForCoverageReport",
                                Jar) {
                            dependsOn v.testedVariant.javaCompileProvider
                            // using get() here forces task configuration, but is necessary
                            // to obtain a valid value for destinationDir
                            from v.testedVariant.javaCompileProvider.get().destinationDir
                            exclude "**/R.class"
                            exclude "**/R\$*.class"
                            exclude "**/BuildConfig.class"
                            destinationDir BuildServerConfigurationKt.getDistributionDirectory(rootProject)
                            archiveName "${project.name}-${v.baseName}-allclasses.jar"
                        }
                        Jacoco.registerClassFilesTask(project, jarifyTask)

                        v.assembleProvider.configure {
                            it.dependsOn jarifyTask
                        }
                    }
                }
            }
        }

        // Copy instrumentation test APKs and app APKs into the dist dir
        // For test apks, they are uploaded only if we have java test sources.
        // For regular app apks, they are uploaded only if they have java sources.
        project.tasks.configureEach { task ->
            if (task.name.startsWith("packageDebug")) {
                // run this task only if we should run it
                def testApk = task.name.contains("AndroidTest")
                if (testApk) {
                    AffectedModuleDetector.configureTaskGuard(task)
                }
                task.doLast {
                    def source = testApk ? project.android.sourceSets.androidTest
                            : project.android.sourceSets.main
                    def hasKotlinSources = false
                    if (source.hasProperty('kotlin')) {
                        if (!source.kotlin.files.isEmpty()) {
                            hasKotlinSources = true
                        } else {
                            // kotlin files does not show in java sources due to the *.java filter
                            // so we need to check them manually
                            hasKotlinSources = source.java.sourceDirectoryTrees.any {
                                !fileTree(dir: it.dir, include:'**/*.kt').files.isEmpty()
                            }
                        }
                    }
                    def hasSourceCode = !source.java.sourceFiles.isEmpty() || hasKotlinSources
                    if (task.hasProperty("outputDirectory") && (hasSourceCode || !testApk)) {
                        copy {
                            from(task.outputDirectory)
                            include '*.apk'
                            into(BuildServerConfigurationKt.getDistributionDirectory(rootProject))
                            rename { String fileName ->
                                if (fileName.contains("media-compat-test")
                                        || fileName.contains("media2-test")) {
                                    // Exclude media-compat-test-* and media2-test-* modules from
                                    // existing support library presubmit tests.
                                    fileName.replace("-debug-androidTest", "")
                                } else if (fileName.contains("-benchmark-debug-androidTest")){
                                    // Exclude '-benchmark' modules from correctness tests, and
                                    // remove '-debug' from the APK name, since it's incorrect
                                    fileName.replace("-debug-androidTest", "-androidBenchmark")
                                } else {
                                    // multiple modules may have the same name so prefix the name with
                                    // the module's path to ensure it is unique.
                                    // e.g. palette-v7-debug-androidTest.apk becomes
                                    // support-palette-v7_palette-v7-debug-androidTest.apk
                                    "${project.getPath().replace(':', '-').substring(1)}_${fileName}"
                                }
                            }
                        }
                    }
                }
            }
        }

        // copy host side test results to DIST
        project.tasks.withType(Test) { task ->
            def junitReport = task.reports.junitXml
            if (junitReport.enabled) {
                def zipTask = project.tasks.create(
                        name: "zipResultsOf${task.name.capitalize()}", type: Zip) {
                    destinationDir(BuildServerConfigurationKt.getHostTestResultDirectory(project))
                    // first one is always :, drop it.
                    archiveName("${project.getPath().split(":").join("_").substring(1)}.zip")
                }
                if (BuildServerConfigurationKt.isRunningOnBuildServer()) {
                    task.ignoreFailures = true
                }
                task.finalizedBy zipTask
                task.doFirst {
                    zipTask.from(junitReport.destination)
                }
            }
        }
    }
}

ext.init.setupRepoOutAndBuildNumber = this.&setupRepoOutAndBuildNumber
ext.init.configureSubProjects = this.&configureSubProjects
