// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

def getLocalProperties() {
    Properties properties = new Properties()
    File propFile = project.rootProject.file('local.properties')
    if (propFile.canRead()) {
        properties.load(propFile.newDataInputStream())
    }
    propFile = project.rootProject.file('gradle.properties')
    if (propFile.canRead()) {
        properties.load(propFile.newDataInputStream())
    }
    return properties
}

def getSDKPath() {
    String path = System.getenv("ANDROID_SDK_ROOT")
    if (path == null) {
        path = getLocalProperties().getProperty('sdk.dir', null)
    }

    if (path == null) {
        throw new GradleScriptException("Android SDK not found! Please set ANDROID_SDK_ROOT to" +
                                        " your path or define sdk.dir in gradle.properties")
    }
    return path
}

def getPathWithDepotTools() {
    System.getenv("PATH") + ":" + getLocalProperties().getProperty('depot_tools.dir', null)
    String path = System.getenv("PATH")
    if (!path.contains("depot_tools")) {
        path += ":" + getLocalProperties().getProperty('depot_tools.dir', null)
    }

    if (!path.contains("depot_tools")) {
        throw GradleScriptException("Depot Tools not found! Please update your path to include" +
                                    " depot_tools or define depot_tools.dir in gradle.properties")
    }
    return path
}

def constructBuildCommand(variant, buildTarget) {
    String cmdLine = "./platform_tools/android/bin/android_ninja $buildTarget"
    String deviceType = null
    if (variant.name.startsWith("arm64")) {
        deviceType = "arm64"
    } else if (variant.name.startsWith("arm")) {
        deviceType = "arm_v7_neon"
    } else if (variant.name.startsWith("x86_64")) {
        deviceType = "x86_64"
    } else if (variant.name.startsWith("x86")) {
        deviceType = "x86"
    } else if (variant.name.startsWith("mips")) {
        deviceType = "mips"
    } else if (variant.name.startsWith("mips64")) {
        deviceType = "mips64"
    }

    if (deviceType != null) {
        cmdLine += " -d " + deviceType
    }

    if (variant.name.endsWith("Release")) {
        cmdLine += " --release"
    }
    return cmdLine
}