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

import java.io.File
import java.nio.file.Paths
import org.apache.tools.ant.taskdefs.condition.Os

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

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

allprojects {
    repositories {
        google()
        jcenter()
    }
}

def setupSkiaLibraryBuild(project, appVariants, appName) {
    appVariants.all{ variant ->
        def buildNativeLib = project.task("${variant.name}_BuildSkiaLib", type:Exec) {
            workingDir '../../../..' // top-level skia directory
            final String cmd = constructBuildCommand(project, variant, appName)
            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                commandLine "cmd", "/c", cmd
            } else {
                commandLine cmd.split()
            }
        }
        buildNativeLib.onlyIf { !project.hasProperty("suppressNativeBuild") }

        def copyNativeLib = project.task("${variant.name}_CopySkiaLib", type:Copy) {
            def fromDir = getVariantOutDir(project, variant).skiaOut
            def intoDir = getVariantOutDir(project, variant).androidOut
            from fromDir
            into intoDir
            include "${appName}.so"
        }

        TaskCollection<Task> compileTask = project.tasks.matching {
            //  println(it.name)
            it.name.toLowerCase().contains("compile" + variant.name.toLowerCase()) &&
                    it.name.toLowerCase().endsWith("ndk")
        }
        compileTask.findAll()*.dependsOn copyNativeLib
        copyNativeLib.dependsOn buildNativeLib
    }
}

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 getVariantOutDir(project, variant) {
    String variantPrefix = null
    String androidLibDir = null
    if (variant.name.startsWith("arm64")) {
        variantPrefix = "arm64"
        androidLibDir = "arm64-v8a"
    } else if (variant.name.startsWith("arm")) {
        variantPrefix = "arm"
        androidLibDir = "armeabi-v7a"
    } else if (variant.name.startsWith("x64")) {
        variantPrefix = "x64"
        androidLibDir = "x86_64"
    } else if (variant.name.startsWith("x86")) {
        variantPrefix = "x86"
        androidLibDir = "x86"
    }

    String skiaOutDir = null
    String propName = "${variantPrefix}.out.dir"
    if (project.hasProperty(propName)) {
        skiaOutDir = project.getProperties().getAt(propName)
    } else {
        skiaOutDir = getLocalProperties().getProperty(propName, "missing_variant_out")
    }

    return [skiaOut: skiaOutDir,
            androidOut: "src/main/libs/${androidLibDir}"]
}

def constructBuildCommand(project, variant, appName) {
    String depotToolsDir = null
    for (String entry : System.getenv("PATH").split(File.pathSeparator)) {
        if (Paths.get(entry).endsWith("depot_tools")) {
            depotToolsDir = entry;
            break;
        }
    }
    if (depotToolsDir == null) {
        depotToolsDir = getLocalProperties().getProperty('depot_tools.dir', null)
    }

    if (depotToolsDir == null) {
        throw GradleScriptException("Depot Tools not found! Please update your path to include" +
                " depot_tools or define depot_tools.dir in local.properties")
    }

    String ninja = Paths.get(depotToolsDir, "ninja")
    String out_dir = getVariantOutDir(project, variant).skiaOut
    return "$ninja -C $out_dir $appName"
}
