import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id 'com.android.application'
    id 'com.google.devtools.ksp'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'dev.flutter.flutter-gradle-plugin'
}

def packageName = "deckers.thibault.aves"

// Flutter properties

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
def flutterVersionName = localProperties.getProperty('flutter.versionName')

// Keys

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    // for release using credentials stored in a local file
    keystorePropertiesFile.withReader('UTF-8') { reader ->
        keystoreProperties.load(reader)
    }
} else {
    // for release using credentials in environment variables set up by GitHub Actions
    // warning: in property file, single quotes should be escaped with a backslash
    // but they should not be escaped when stored in env variables
    keystoreProperties["storeFile"] = System.getenv("AVES_STORE_FILE") ?: "<NONE>"
    keystoreProperties["storePassword"] = System.getenv("AVES_STORE_PASSWORD") ?: "<NONE>"
    keystoreProperties["keyAlias"] = System.getenv("AVES_KEY_ALIAS") ?: "<NONE>"
    keystoreProperties["keyPassword"] = System.getenv("AVES_KEY_PASSWORD") ?: "<NONE>"
    keystoreProperties["googleApiKey"] = System.getenv("AVES_GOOGLE_API_KEY") ?: "<NONE>"
}

android {
    namespace 'deckers.thibault.aves'
    compileSdk 35
    // cf https://developer.android.com/studio/projects/install-ndk#default-ndk-per-agp
    ndkVersion '26.1.10909125'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    lint {
        checkAllWarnings true
        warningsAsErrors true
        disable 'InvalidPackage'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        applicationId packageName
        minSdk flutter.minSdkVersion
        targetSdk 35
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        manifestPlaceholders = [googleApiKey: keystoreProperties["googleApiKey"] ?: "<NONE>"]
        multiDexEnabled true
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties["keyAlias"]
            keyPassword keystoreProperties["keyPassword"]
            storeFile keystoreProperties["storeFile"] ? file(keystoreProperties["storeFile"]) : null
            storePassword keystoreProperties["storePassword"]
        }
    }

    flavorDimensions = ["store"]

    productFlavors {
        play {
            // Google Play
            dimension "store"
            // generate a universal APK without x86 native libs
            ext.useNdkAbiFilters = true
        }

        izzy {
            // IzzyOnDroid
            // check offending libraries with `scanapk`
            // cf https://android.izzysoft.de/articles/named/app-modules-2
            dimension "store"
            // generate APK by ABI, but NDK ABI filters are incompatible with split APK generation
            ext.useNdkAbiFilters = false
        }

        libre {
            // F-Droid
            // check offending libraries with `fdroidserver`
            // cf https://f-droid.org/en/docs/Submitting_to_F-Droid_Quick_Start_Guide/
            dimension "store"
            // generate APK by ABI, but NDK ABI filters are incompatible with split APK generation
            ext.useNdkAbiFilters = false
            applicationIdSuffix ".libre"
        }
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
        profile {
            applicationIdSuffix ".profile"
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        applicationVariants.all { variant ->
            variant.resValue 'string', 'screen_saver_settings_activity', "${applicationId}/${packageName}.ScreenSaverSettingsActivity"
            variant.resValue 'string', 'search_provider', "${applicationId}.search_provider"

            variant.outputs.each { output ->
                def baseAbiVersionCode = rootProject.ext.abiCodes.get(output.getFilter(com.android.build.OutputFile.ABI))
                if (baseAbiVersionCode != null) {
                    output.versionCodeOverride = variant.versionCode * 100 + baseAbiVersionCode
                }
            }
        }

        android.productFlavors.each { flavor ->
            def tasks = gradle.startParameter.taskNames.toString().toLowerCase()
            if (tasks.contains(flavor.name) && flavor.ext.useNdkAbiFilters) {
                release {
                    // specify architectures, to specifically exclude native libs for x86,
                    // which lead to: UnsatisfiedLinkError...couldn't find "libflutter.so"
                    // cf https://github.com/flutter/flutter/issues/37566#issuecomment-640879500
                    ndk {
                        //noinspection ChromeOsAbiSupport
                        abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
                    }
                }
            }
        }
    }
}

tasks.withType(KotlinCompile).configureEach {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

kotlin {
    jvmToolchain(17)
}

flutter {
    source '../..'
}

repositories {
    maven {
        url 'https://jitpack.io'
        content {
            includeGroup "com.github.deckerst"
            includeGroup "com.github.deckerst.mp4parser"
        }
    }
    maven {
        url 'https://s3.amazonaws.com/repo.commonsware.com'
        content {
            excludeGroupByRegex "com\\.github\\.deckerst.*"
        }
    }
}

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'

    implementation "androidx.appcompat:appcompat:1.7.0"
    implementation 'androidx.core:core-ktx:1.13.1'
    implementation 'androidx.lifecycle:lifecycle-process:2.8.3'
    implementation 'androidx.media:media:1.7.0'
    implementation 'androidx.multidex:multidex:2.0.1'
    implementation 'androidx.security:security-crypto:1.1.0-alpha06'
    implementation 'androidx.work:work-runtime-ktx:2.9.0'

    implementation 'com.caverock:androidsvg-aar:1.4'
    implementation 'com.commonsware.cwac:document:0.5.0'
    implementation 'com.drewnoakes:metadata-extractor:2.19.0'
    implementation "com.github.bumptech.glide:glide:$glide_version"
    implementation 'com.google.android.material:material:1.12.0'
    // SLF4J implementation for `mp4parser`
    implementation 'org.slf4j:slf4j-simple:2.0.13'

    // forked, built by JitPack:
    // - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory
    // - https://jitpack.io/p/deckerst/mp4parser
    // - https://jitpack.io/p/deckerst/pixymeta-android
    implementation 'com.github.deckerst:Android-TiffBitmapFactory:90c06eebf4'
    implementation 'com.github.deckerst.mp4parser:isoparser:4cc0c5d06c'
    implementation 'com.github.deckerst.mp4parser:muxer:4cc0c5d06c'
    implementation 'com.github.deckerst:pixymeta-android:9ec7097f17'
    implementation project(':exifinterface')

    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.2'

    kapt 'androidx.annotation:annotation:1.8.0'
    ksp "com.github.bumptech.glide:ksp:$glide_version"

    compileOnly rootProject.findProject(':streams_channel')
}

if (useCrashlytics) {
    println("Building flavor with Crashlytics plugin")
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'com.google.firebase.crashlytics'
}
