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

ext {
    PUBLISH_VERSION = getGodotPublishVersion()
    PUBLISH_ARTIFACT_ID = 'godot'
}

apply from: "../scripts/publish-module.gradle"

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 = [godotLibraryVersion: getGodotLibraryVersionName()]
    }

    namespace = "org.godotengine.godot"

    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")
        }

        def buildType = variant.buildType.name
        if (buildType == null || buildType == "" || !supportedFlavorsBuildTypes[flavorName].contains(buildType)) {
            throw new GradleException("Invalid build type: $buildType")
        }

        boolean devBuild = buildType == "dev"

        def sconsTarget = flavorName
        if (sconsTarget == "template") {
            switch (buildType) {
                case "release":
                    sconsTarget += "_release"
                    break
                case "debug":
                case "dev":
                default:
                    sconsTarget += "_debug"
                    break;
            }
        }

        // Update the name of the generated library
        def outputSuffix = "${sconsTarget}"
        if (devBuild) {
            outputSuffix = "${outputSuffix}.dev"
        }
        variant.outputs.all { output ->
            output.outputFileName = "godot-lib.${outputSuffix}.aar"
        }

        // 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", "dev_mode=${devBuild}", "dev_build=${devBuild}", "target=${sconsTarget}", "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
        }
    }

    // TODO: Enable when issues with AGP 7.1+ are resolved (https://github.com/GodotVR/godot_openxr/issues/187).
//    publishing {
//        singleVariant("templateRelease") {
//            withSourcesJar()
//            withJavadocJar()
//        }
//    }
}