plugins {
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
}

dependencies {
    implementation libraries.kotlinStdLib
    implementation libraries.androidxFragment
}

def pathToRootDir = "../../../../"

android {
    compileSdkVersion versions.compileSdk
    buildToolsVersion versions.buildTools
    ndkVersion versions.ndkVersion

    defaultConfig {
        minSdkVersion versions.minSdk
        targetSdkVersion versions.targetSdk

        manifestPlaceholders = [pandemoniumLibraryVersion: getPandemoniumLibraryVersionName()]
    }

    compileOptions {
        sourceCompatibility versions.javaVersion
        targetCompatibility versions.javaVersion
    }

    kotlinOptions {
        jvmTarget = versions.javaVersion
    }

    buildTypes {
        dev {
            initWith debug
        }
    }

    flavorDimensions "products"
    productFlavors {
        editor {}
        template {}
    }

    lintOptions {
        abortOnError false
        disable 'MissingTranslation', 'UnusedResources'
    }

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'

        // 'doNotStrip' is enabled for development within Android Studio
        if (shouldNotStrip()) {
            doNotStrip '**/*.so'
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            aidl.srcDirs = ['aidl']
            assets.srcDirs = ['assets']
        }

        debug.jniLibs.srcDirs = ['libs/debug']
        dev.jniLibs.srcDirs = ['libs/dev']
        release.jniLibs.srcDirs = ['libs/release']

        // Editor jni library
        editorDebug.jniLibs.srcDirs = ['libs/tools/debug']
        editorDev.jniLibs.srcDirs = ['libs/tools/dev']
    }

    // Disable 'editorRelease'.
    // The editor can't be used with target=release as debugging tools are then not
    // included, and it would crash on errors instead of reporting them.
    variantFilter { variant ->
        if (variant.name == "editorRelease") {
            setIgnore(true)
        }
    }

    libraryVariants.all { variant ->
        def flavorName = variant.getFlavorName()

        if (flavorName == null || flavorName == "") {
            throw new GradleException("Invalid product flavor: $flavorName")
        }

        boolean toolsFlag = flavorName == "editor"

        def buildType = variant.buildType.name
        if (buildType == null || buildType == "" || !supportedTargetsMap.containsKey(buildType)) {
            throw new GradleException("Invalid build type: $buildType")
        }

        def sconsTarget = supportedTargetsMap[buildType]
        if (sconsTarget == null || sconsTarget == "") {
            throw new GradleException("Invalid scons target: $sconsTarget")
        }

        // Update the name of the generated library
        def outputSuffix = "${buildType}.aar"
        if (toolsFlag) {
            outputSuffix = "tools.$outputSuffix"
        }

        variant.outputs.all { output ->
            output.outputFileName = "pandemonium-lib.${outputSuffix}"
        }

        // Find scons' executable path
        File sconsExecutableFile = null
        def sconsName = "scons"
        def sconsExts = (org.gradle.internal.os.OperatingSystem.current().isWindows()
            ? [".bat", ".cmd", ".ps1", ".exe"]
            : [""])
        logger.lifecycle("Looking for $sconsName executable path")
        for (ext in sconsExts) {
            String sconsNameExt = sconsName + ext
            logger.lifecycle("Checking $sconsNameExt")

            sconsExecutableFile = org.gradle.internal.os.OperatingSystem.current().findInPath(sconsNameExt)
            if (sconsExecutableFile != null) {
                // We're done!
                break
            }

            // Check all the options in path
            List<File> allOptions = org.gradle.internal.os.OperatingSystem.current().findAllInPath(sconsNameExt)
            if (!allOptions.isEmpty()) {
                // Pick the first option and we're done!
                sconsExecutableFile = allOptions.get(0)
                break
            }
        }

        if (sconsExecutableFile == null) {
            throw new GradleException("Unable to find executable path for the '$sconsName' command.")
        } else {
            logger.lifecycle("Found executable path for $sconsName: ${sconsExecutableFile.absolutePath}")
        }

        for (String selectedAbi : selectedAbis) {
            if (!supportedAbis.contains(selectedAbi)) {
                throw new GradleException("Invalid selected abi: $selectedAbi")
            }

            // Creating gradle task to generate the native libraries for the selected abi.
            def taskName = getSconsTaskName(flavorName, buildType, selectedAbi)
            tasks.create(name: taskName, type: Exec) {
                executable sconsExecutableFile.absolutePath
                args "--directory=${pathToRootDir}", "platform=android", "tools=${toolsFlag}", "target=${sconsTarget}", "android_arch=${selectedAbi}", "-j" + Runtime.runtime.availableProcessors()
            }

            // Schedule the tasks so the generated libs are present before the aar file is packaged.
            tasks["merge${flavorName.capitalize()}${buildType.capitalize()}JniLibFolders"].dependsOn taskName
        }
    }
}
