/*
 * 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 org.gradle.api.artifacts.dsl.RepositoryHandler;

String getFullSdkPath(String prebuiltsRoot) {
    final String osName = System.getProperty("os.name").toLowerCase()
    final boolean isMacOsX =
            osName.contains("mac os x") || osName.contains("darwin") || osName.contains("osx");
    final String platform = isMacOsX ? 'darwin' : 'linux'
    return "${prebuiltsRoot}/fullsdk-${platform}"
}

def supportRoot = ext.supportRootFolder
if (supportRoot == null) {
    throw new RuntimeException("variable supportRootFolder is not set. you must set it before" +
            " including this script")
}

def checkoutRoot = "${supportRoot}/../.."
ext.repos = new Properties()
ext.repos.prebuiltsRoot = "${checkoutRoot}/prebuilts"
ext.repos.prebuiltsRootUri = "file://${repos.prebuiltsRoot}"

ext.repoNames = ["${repos.prebuiltsRoot}/gradle-plugin",
                 "${repos.prebuiltsRoot}/tools/common/m2/repository",
                 "${repos.prebuiltsRoot}/maven_repo/android",
                 "${getFullSdkPath(repos.prebuiltsRoot)}/extras/m2repository"]

/**
 * Adds maven repositories to the given repository handler.
 */
def addMavenRepositories(RepositoryHandler handler) {
    repoNames.each { repo ->
        handler.maven {
            url repo
        }
    }
    if (System.getenv("ALLOW_PUBLIC_REPOS") != null) {
        handler.mavenCentral()
        handler.jcenter()
        handler.google()
    }
    def androidPluginRepoOverride = System.getenv("GRADLE_PLUGIN_REPO")
    if (androidPluginRepoOverride != null) {
        handler.maven {
            url androidPluginRepoOverride
        }
    }
}

ext.repos.addMavenRepositories = this.&addMavenRepositories