/*
 * 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.internal.os.OperatingSystem

buildscript {
    repositories {
        maven { url '../../prebuilts/gradle-plugin' }
        maven { url '../../prebuilts/tools/common/m2/repository' }
        maven { url '../../prebuilts/tools/common/m2/internal' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
    }
}

apply from: 'version.gradle'

final String platform = OperatingSystem.current().isMacOsX() ? 'darwin' : 'linux'
System.setProperty('android.dir', "${rootDir}/../../")
final String fullSdkPath = "${rootDir}/../../prebuilts/fullsdk-${platform}"
if (file(fullSdkPath).exists()) {
    gradle.ext.currentSdk = 26
    ext.buildToolsVersion = '26.0.0'
    project.ext.androidJar = files("${fullSdkPath}/platforms/android-${gradle.currentSdk}/android.jar")
    System.setProperty('android.home', "${rootDir}/../../prebuilts/fullsdk-${platform}")
    File props = file("local.properties")
    props.write "sdk.dir=${fullSdkPath}"
} else {
    gradle.ext.currentSdk = 'current'
    ext.buildToolsVersion = '26.0.0'
    project.ext.androidJar = files("${project.rootDir}/../../prebuilts/sdk/current/android.jar")
    File props = file("local.properties")
    props.write "android.dir=../../"
}

/*
 * With the build server you are given two env variables.
 * The OUT_DIR is a temporary directory you can use to put things during the build.
 * The DIST_DIR is where you want to save things from the build.
 *
 * The build server will copy the contents of DIST_DIR to somewhere and make it available.
 */
if (System.env.DIST_DIR != null && System.env.OUT_DIR != null) {
    buildDir = new File(System.env.OUT_DIR + '/gradle/frameworks/support/build').getCanonicalFile()
    project.ext.distDir = new File(System.env.DIST_DIR).getCanonicalFile()
} else {
    buildDir = file('../../out/host/gradle/frameworks/support/build')
    project.ext.distDir = file('../../out/dist')
}

ext.supportRepoOut = new File(buildDir, 'support_repo')

// upload anchor for subprojects to upload their artifacts
// to the local repo.
task dist(type: Zip)  {
    group = BasePlugin.BUILD_GROUP
    description 'Builds distribution artifacts.'

    from project.ext.supportRepoOut
    into 'm2repository'
    destinationDir project.ext.distDir
    baseName = String.format("top-of-tree-m2repository-%s", project.multidexVersion)

    doLast {
        logger.warn "Compressed maven artifacts to ${archivePath}"
    }
}

subprojects {
    // Change buildDir first so that all plugins pick up the new value.
    project.buildDir = project.file("${project.parent.buildDir}/../${project.name}/build")

    apply plugin: 'maven'

    version = rootProject.multidexVersion
    group = 'com.android.support'

    dist.dependsOn project.tasks.uploadArchives

    project.plugins.whenPluginAdded { plugin ->
        if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
            project.android.buildToolsVersion = rootProject.buildToolsVersion
        }
    }
}
