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

def isUiProject = System.getenv("DIST_SUBDIR") == "/ui"

def build_versions = [:]

// NOTE: lint versions *must* be kept in sync with agp
if (isUiProject) {
    build_versions.kotlin = "1.3.70"
    build_versions.kotlin_coroutines = "1.3.6"
    build_versions.agp = '4.1.0-alpha08'
    build_versions.lint = '27.1.0-alpha08'
} else {
    build_versions.kotlin = "1.3.71"
    build_versions.kotlin_coroutines = "1.3.4"
    build_versions.agp = '4.1.0-alpha08'
    // NOTE: When updating the lint version we also need to update the `api` version supported
    //  by `IssueRegistry`'s.' For e.g. aosp/1331903
    build_versions.lint = '27.1.0-alpha08'
}

def agpOverride = System.getenv("GRADLE_PLUGIN_VERSION")
if (agpOverride != null) {
    logger.warn("Using custom version ${agpOverride} of AGP due to GRADLE_PLUGIN_VERSION being set.")
    build_versions.agp = agpOverride
}

// gets the version of Dokka defined in source
def getSourceDokkaVersion() {
    def dokkaProps = new Properties()
    FileInputStream f = new FileInputStream(project.file("${project.ext.supportRootFolder}/../../external/dokka/gradle.properties"))
    dokkaProps.load(f)
    f.close()

    return dokkaProps["dokka_version"]
}

if (System.getenv("BUILD_DOKKA") != null) {
    build_versions.dokka = getSourceDokkaVersion()
} else {
    build_versions.dokka = '0.9.17-g010'
}

rootProject.ext['build_versions'] = build_versions

def build_libs = [:]

build_libs.agp = "com.android.tools.build:gradle:${build_versions.agp}"

build_libs.lint = [
    core: "com.android.tools.lint:lint:${build_versions.lint}",
    api: "com.android.tools.lint:lint-api:${build_versions.lint}",
    tests: "com.android.tools.lint:lint-tests:${build_versions.lint}"
]

build_libs.kotlin = [
    stdlib: "org.jetbrains.kotlin:kotlin-stdlib:${build_versions.kotlin}",
    gradle_plugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:${build_versions.kotlin}"
]
build_libs.dex_member_list = "com.jakewharton.dex:dex-member-list:4.1.1"
build_libs.dokka_gradle = [
    "org.jetbrains.dokka:dokka-android-gradle-plugin:${build_versions.dokka}",
]
build_libs.kotlinpoet = "com.squareup:kotlinpoet:1.4.0"

rootProject.ext['build_libs'] = build_libs
