/*
 * Copyright 2020 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.
 */

// A generic settings.gradle file for all playground projects that sets it up to use public
// artifacts and the playground-build.gradle build file.
// See README.md for details

def includeProject(name, filePath) {
    settings.include(name)

    def file
    if (filePath instanceof String) {
        file = new File(rootDir, filePath)
    } else {
        file = filePath
    }
    project(name).projectDir = file
}

/**
 * Initializes the playground project to use public repositories as well as other internal projects
 * that cannot be found in public repositories.
 *
 * @param settings The reference to the settings script
 * @param relativePathToRoot The relative path of the project to the root AndroidX project
 */
def setupPlayground(settings, String relativePathToRoot) {
    def projectDir = settings.rootProject.getProjectDir()
    def supportRoot = new File(projectDir, relativePathToRoot).getCanonicalFile()
    def buildFile = new File(supportRoot, "playground-common/playground-build.gradle")
    def relativePathToBuild = projectDir.toPath().relativize(buildFile.toPath()).toString()
    Properties playgroundProperties = new Properties()
    File propertiesFile = new File(supportRoot, "playground-common/playground.properties")
    propertiesFile.withInputStream {
        playgroundProperties.load(it)
    }
    gradle.beforeProject { project ->
        // load playground properties. These are not kept in the playground projects to prevent
        // AndroidX build from reading them.
        playgroundProperties.each {
            project.ext[it.key] = it.value
        }
    }
    settings.ext.supportRootDir = supportRoot
    settings.rootProject.buildFileName = relativePathToBuild
    settings.pluginManagement {
        repositories {
            google()
            mavenCentral()
            jcenter()
        }
    }
    settings.enableFeaturePreview("VERSION_CATALOGS")
    settings.dependencyResolutionManagement {
        versionCatalogs {
            libs {
                from(files("$supportRoot/gradle/libs.versions.toml"))
            }
        }
    }
    settings.includeBuild(new File(supportRoot, "androidx-plugin"))
    settings.includeProject(":lint-checks", new File(supportRoot, "lint-checks"))
    settings.includeProject(":lint-checks:integration-tests",
            new File(supportRoot, "lint-checks/integration-tests"))
    settings.includeProject(":fakeannotations", new File(supportRoot,"fakeannotations"))
    settings.includeProject(":internal-testutils-common",
            new File(supportRoot, "testutils/testutils-common"))
    settings.includeProject(":internal-testutils-gradle-plugin",
            new File(supportRoot, "testutils/testutils-gradle-plugin"))
}

/**
 * A convenience method to include projects from the main AndroidX build using a filter.
 *
 * @param filter This filter will be called with the project name (project path in gradle).
 *               If filter returns true, it will be included in the build.
 */
def selectProjectsFromAndroidX(filter) {
    def includeProjectPattern = ~/.*includeProject\("(?<name>.*)", "(?<path>.*)"(.*)\).*/
    def supportSettingsFile = new File(ext.supportRootDir, "settings.gradle")
    supportSettingsFile.eachLine { line ->
        def matcher = (line =~ includeProjectPattern)
        // check if is an include project line, if so, extract project gradle path and
        // file system path and call the filter
        if (matcher.matches()) {
            def projectGradlePath = matcher.group("name")
            def projectFilePath = matcher.group("path")
            if (filter(projectGradlePath)) {
                settings.includeProject(projectGradlePath,
                        new File(ext.supportRootDir, projectFilePath))
            }
        }
    }
}

// define functions that can be called by the main settings.gradle file
ext.includeProject = this.&includeProject
ext.selectProjectsFromAndroidX = this.&selectProjectsFromAndroidX
ext.setupPlayground = this.&setupPlayground

// validate JVM version to print an understandable error if it is not set to the
// required value (11)
def jvmVersion = System.getProperty("java.vm.specification.version")
if (jvmVersion != "11") {
    def guidance;
    if (startParameter.projectProperties.containsKey("android.injected.invoked.from.ide")) {
        guidance = "Make sure to set the gradle JDK to JDK 11 in the project settings." +
                   "(File -> Other Settings -> Default Project Structure)"
    } else {
        guidance = "Make sure your JAVA_HOME environment variable points to Java 11 JDK."
    }
    throw new IllegalStateException("""
            AndroidX build must be invoked with JDK 11.
            $guidance
            Current version: $jvmVersion
            Current JAVA HOME: ${System.getProperty("java.home")}""".stripIndent());
}
