/*
 * 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.replaceFirst(":", "").replaceAll(":", "/")
    project.layout.buildDirectory.set(new File(buildSrcOut, "$pathAsFilepath/build").getCanonicalFile())
}

def chooseOutDir(subdir = "") {
    chooseBuildSrcBuildDir()
    project.layout.buildDirectory.set(new File(project.ext.outDir, subdir))
    subprojects {
        // Expected out directory structure for :foo:bar is out/androidx/foo/bar
        it.buildDir = new File(outDir, "${subdir}/androidx/${it.path.replace(":", "/")}/build")
    }
}

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