/*
 * Copyright (C) 2019 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 groovy.lang.Tuple;

def init = new Properties()
ext.init = init

def getOutDir(subdir = "") {
    /*
     * The OUT_DIR is a temporary directory you can use to put things during the build.
     */
    def outDir = System.env.OUT_DIR
    def buildSrcOut
    if (outDir == null) {
        def checkoutRoot = System.getProperty("CHECKOUT_ROOT")
        if (checkoutRoot == null) {
            checkoutRoot = new File("${buildscript.sourceFile.parent}/../../..")
        }
        outDir = new File("${checkoutRoot}/out${subdir}")
        buildSrcOut = new File("${checkoutRoot}/out/buildSrc")
    } else {
        outDir = new File(outDir)
        buildSrcOut = new File("${outDir}/buildSrc")
    }
    return new Tuple(outDir, buildSrcOut)
}

// Ideally this function would just be chooseBuildDir, but Gradle doesn't include the text ":buildSrc" in the project path
def chooseBuildSrcBuildDir(subdir = "") {
    def (outDir, buildSrcOut) = getOutDir(subdir)
    project.ext.buildSrcOut = buildSrcOut
    project.ext.outDir = outDir
    def pathAsFilepath = project.path.replace(":", "").replaceAll(":", "/")
    project.layout.buildDirectory.set(new File(buildSrcOut, "$pathAsFilepath/build").getCanonicalFile())
}

def chooseOutDir(subdir = "") {
    chooseBuildSrcBuildDir()
    subprojects {
        // Change buildDir first so that all plugins pick up the new value.
        project.layout.buildDirectory.set(new File("$project.parent.buildDir/../$project.name/build"))
    }
}

ext.init.getOutDir = this.&getOutDir
ext.init.chooseOutDir = this.&chooseOutDir
ext.init.chooseBuildSrcBuildDir = this.&chooseBuildSrcBuildDir
