apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"

def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
// @generated begin pocket-ai-release-config - expo prebuild (DO NOT MODIFY) sync-b59510f617824a631b9e09c2e7b8bbf8af33209d
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("../keystore.properties")
if (keystorePropertiesFile.exists()) {
    keystorePropertiesFile.withInputStream { stream ->
        keystoreProperties.load(stream)
    }
}

def resolveStoreFileValue = { configuredPath ->
    if (configuredPath == null || !configuredPath.toString().trim()) {
        return null
    }

    def configuredFile = new File(configuredPath.toString().trim())
    if (configuredFile.isAbsolute()) {
        return configuredFile.absolutePath
    }

    return new File(keystorePropertiesFile.parentFile, configuredPath.toString().trim()).absolutePath
}

def resolveConfigValue = { gradleKey, envKey, propertiesKey ->
    def gradleValue = findProperty(gradleKey)
    if (gradleValue != null && gradleValue.toString().trim()) {
        return gradleValue.toString().trim()
    }

    def envValue = System.getenv(envKey)
    if (envValue != null && envValue.toString().trim()) {
        return envValue.toString().trim()
    }

    def propertyValue = keystoreProperties.getProperty(propertiesKey)
    if (propertyValue != null && propertyValue.toString().trim()) {
        return propertyValue.toString().trim()
    }

    return null
}

def resolveBooleanValue = { gradleKey, envKey, defaultValue ->
    def gradleValue = findProperty(gradleKey)
    if (gradleValue != null) {
        return gradleValue.toString().toLowerCase() in ["1", "true", "yes", "y"]
    }

    def envValue = System.getenv(envKey)
    if (envValue != null) {
        return envValue.toString().toLowerCase() in ["1", "true", "yes", "y"]
    }

    return defaultValue
}

def pocketAiDefaultVersionCode = 20
def pocketAiDefaultVersionName = "1.6.3"

def appVersionCodeValue = (findProperty("pocketAiVersionCode") ?: System.getenv("POCKET_AI_VERSION_CODE") ?: pocketAiDefaultVersionCode).toString()
def appVersionNameValue = (findProperty("pocketAiVersionName") ?: System.getenv("POCKET_AI_VERSION_NAME") ?: pocketAiDefaultVersionName).toString()
def appVersionCode = appVersionCodeValue.toInteger()

def releaseStoreFile = resolveStoreFileValue(resolveConfigValue("pocketAiUploadStoreFile", "POCKET_AI_UPLOAD_STORE_FILE", "storeFile"))
def releaseStorePassword = resolveConfigValue("pocketAiUploadStorePassword", "POCKET_AI_UPLOAD_STORE_PASSWORD", "storePassword")
def releaseKeyAlias = resolveConfigValue("pocketAiUploadKeyAlias", "POCKET_AI_UPLOAD_KEY_ALIAS", "keyAlias")
def releaseKeyPassword = resolveConfigValue("pocketAiUploadKeyPassword", "POCKET_AI_UPLOAD_KEY_PASSWORD", "keyPassword")
def hasReleaseSigning = [releaseStoreFile, releaseStorePassword, releaseKeyAlias, releaseKeyPassword].every { it } &&
    new File(releaseStoreFile).exists()

def allowDebugReleaseSigning = resolveBooleanValue(
    "pocketAiAllowDebugReleaseSigning",
    "POCKET_AI_ALLOW_DEBUG_RELEASE_SIGNING",
    false
)

def isReleaseArtifactTaskName = { taskName ->
    def normalized = taskName.toString().toLowerCase()
    def isRelease = normalized.contains("release")
    def isArtifact = normalized.contains("bundle") || normalized.contains("assemble") || normalized.contains("package") || normalized.contains("install")
    return isRelease && isArtifact
}

gradle.taskGraph.whenReady { taskGraph ->
    def wantsSignedReleaseArtifact = taskGraph.allTasks.any { task ->
        return isReleaseArtifactTaskName(task.name) || isReleaseArtifactTaskName(task.path)
    }

    if (wantsSignedReleaseArtifact && !hasReleaseSigning) {
        if (!allowDebugReleaseSigning) {
            throw new GradleException(
                "Pocket AI upload signing is not configured. Create keystore.properties and keystores/... or set POCKET_AI_UPLOAD_* environment variables. " +
                "To build a debug-signed release artifact for local testing only, set POCKET_AI_ALLOW_DEBUG_RELEASE_SIGNING=true."
            )
        }

        logger.lifecycle("Pocket AI release signing is not configured. Falling back to the debug keystore for local builds.")
    }
}
// @generated end pocket-ai-release-config

/**
 * This is the configuration block to customize your React Native Android app.
 * By default you don't need to apply any configuration, just uncomment the lines you need.
 */
react {
    entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
    reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
    hermesCommand = new File(["node", "--print", "require.resolve('hermes-compiler/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/hermesc/%OS-BIN%/hermesc"
    codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()

    enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean()
    // Use Expo CLI to bundle the app, this ensures the Metro config
    // works correctly with Expo projects.
    cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
    bundleCommand = "export:embed"

    /* Folders */
     //   The root of your project, i.e. where "package.json" lives. Default is '../..'
    // root = file("../../")
    //   The folder where the react-native NPM package is. Default is ../../node_modules/react-native
    // reactNativeDir = file("../../node_modules/react-native")
    //   The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
    // codegenDir = file("../../node_modules/@react-native/codegen")

    /* Variants */
    //   The list of variants to that are debuggable. For those we're going to
    //   skip the bundling of the JS bundle and the assets. By default is just 'debug'.
    //   If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
    // debuggableVariants = ["liteDebug", "prodDebug"]

    /* Bundling */
    //   A list containing the node command and its flags. Default is just 'node'.
    // nodeExecutableAndArgs = ["node"]

    //
    //   The path to the CLI configuration file. Default is empty.
    // bundleConfig = file(../rn-cli.config.js)
    //
    //   The name of the generated asset file containing your JS bundle
    // bundleAssetName = "MyApplication.android.bundle"
    //
    //   The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
    // entryFile = file("../js/MyApplication.android.js")
    //
    //   A list of extra flags to pass to the 'bundle' commands.
    //   See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
    // extraPackagerArgs = []

    /* Hermes Commands */
    //   The hermes compiler command to run. By default it is 'hermesc'
    // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
    //
    //   The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
    // hermesFlags = ["-O", "-output-source-map"]

    /* Autolinking */
    autolinkLibrariesWithApp()
}

/**
 * Set this to true in release builds to optimize the app using [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization).
 */
def enableMinifyInReleaseBuilds = (findProperty('android.enableMinifyInReleaseBuilds') ?: false).toBoolean()

/**
 * The preferred build flavor of JavaScriptCore (JSC)
 *
 * For example, to use the international variant, you can use:
 * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
 *
 * The international variant includes ICU i18n library and necessary data
 * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
 * give correct results when using with locales other than en-US. Note that
 * this variant is about 6MiB larger per architecture than default.
 */
def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'

android {
    splits {
        abi {
            reset()
            enable true
            universalApk false
            include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
    }
    ndkVersion rootProject.ext.ndkVersion

    buildToolsVersion rootProject.ext.buildToolsVersion
    compileSdk rootProject.ext.compileSdkVersion

    namespace 'com.github.tah10n.pocketai'
    defaultConfig {
        applicationId 'com.github.tah10n.pocketai'
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode appVersionCode
        versionName appVersionNameValue

        buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
    }
    signingConfigs {
// @generated begin pocket-ai-release-signing - expo prebuild (DO NOT MODIFY) sync-b8c8b09e29d85945efe531a5e91f02266d001526
        if (hasReleaseSigning) {
            release {
                storeFile file(releaseStoreFile)
                storePassword releaseStorePassword
                keyAlias releaseKeyAlias
                keyPassword releaseKeyPassword
            }
        }
// @generated end pocket-ai-release-signing
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            signingConfig hasReleaseSigning ? signingConfigs.release : signingConfigs.debug
            def enableShrinkResources = findProperty('android.enableShrinkResourcesInReleaseBuilds') ?: 'false'
            shrinkResources enableShrinkResources.toBoolean()
            minifyEnabled enableMinifyInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            def enablePngCrunchInRelease = findProperty('android.enablePngCrunchInReleaseBuilds') ?: 'true'
            crunchPngs enablePngCrunchInRelease.toBoolean()
        }
    }
    packagingOptions {
        jniLibs {
            def enableLegacyPackaging = findProperty('expo.useLegacyPackaging') ?: 'false'
            useLegacyPackaging enableLegacyPackaging.toBoolean()
        }
    }
    androidResources {
        ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~'
    }
}

// Apply static values from `gradle.properties` to the `android.packagingOptions`
// Accepts values in comma delimited lists, example:
// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini
["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop ->
    // Split option: 'foo,bar' -> ['foo', 'bar']
    def options = (findProperty("android.packagingOptions.$prop") ?: "").split(",");
    // Trim all elements in place.
    for (i in 0..<options.size()) options[i] = options[i].trim();
    // `[] - ""` is essentially `[""].filter(Boolean)` removing all empty strings.
    options -= ""

    if (options.length > 0) {
        println "android.packagingOptions.$prop += $options ($options.length)"
        // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**'
        options.each {
            android.packagingOptions[prop] += it
        }
    }
}

dependencies {
    // The version of react-native is set by the React Native Gradle Plugin
    implementation("com.facebook.react:react-android")

    def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
    def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
    def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";

    if (isGifEnabled) {
        // For animated gif support
        implementation("com.facebook.fresco:animated-gif:${expoLibs.versions.fresco.get()}")
    }

    if (isWebpEnabled) {
        // For webp support
        implementation("com.facebook.fresco:webpsupport:${expoLibs.versions.fresco.get()}")
        if (isWebpAnimatedEnabled) {
            // Animated webp support
            implementation("com.facebook.fresco:animated-webp:${expoLibs.versions.fresco.get()}")
        }
    }

    if (hermesEnabled.toBoolean()) {
        implementation("com.facebook.react:hermes-android")
    } else {
        implementation jscFlavor
    }
}
