plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.plugin.serialization' version "1.8.21"
}

task copyProfile (type: Copy) {
    description('Copies a generated baseline profile text file from managed device to src/main in the app module.')
    from(project(':benchmark').file('build/outputs/managed_device_android_test_additional_output/pixel6Api31'))
    into('src/main')
    include('BaselineProfileGenerator_generate-baseline-prof.txt')
    rename('BaselineProfileGenerator_generate-baseline-prof', 'baseline-prof')
}

android {
    compileSdkVersion 33
    ndkVersion "25.2.9519653"

    viewBinding.enabled = true

    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true

        sourceCompatibility = "17"
        targetCompatibility = "17"
    }

    kotlinOptions {
        jvmTarget = '17'
    }

    lint {
        // This is important as it will run lint but not abort on error
        // Lint has some overly obnoxious "errors" that should really be warnings
        abortOnError false

        //Uncomment disable lines for test builds...
        //disable 'MissingTranslation'
        //disable 'ExtraTranslation'
    }

    defaultConfig {
        applicationId "org.dolphinemu.dolphinemu"
        minSdkVersion 21
        targetSdkVersion 33

        versionCode(getBuildVersionCode())

        versionName "${getVersion()}"

        buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\""
        buildConfigField "String", "BRANCH", "\"${getBranch()}\""

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            if (project.hasProperty('keystore')) {
                storeFile file(project.property('keystore'))
                storePassword project.property('storepass')
                keyAlias project.property('keyalias')
                keyPassword project.property('keypass')
            }
        }
    }

    // Define build types, which are orthogonal to product flavors.
    buildTypes {
        // Signed by release key, allowing for upload to Play Store.
        release {
            if (project.hasProperty('keystore')) {
                signingConfig signingConfigs.release
            }

            resValue 'string', 'app_name_suffixed', 'Dolphin Emulator'
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'),
                'proguard-rules.pro'

            preBuild.dependsOn copyProfile
        }

        // Signed by debug key disallowing distribution on Play Store.
        // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
        debug {
            resValue 'string', 'app_name_suffixed', 'Dolphin Debug'
            applicationIdSuffix ".debug"
            versionNameSuffix '-debug'
            jniDebuggable true
        }

        benchmark {
            resValue 'string', 'app_name_suffixed', 'Dolphin Benchmark'
            signingConfig signingConfigs.debug
            matchingFallbacks = ['release']
            debuggable false
            applicationIdSuffix ".benchmark"
            versionNameSuffix '-benchmark'
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
            minifyEnabled true
            shrinkResources true
        }
    }

    externalNativeBuild {
        cmake {
            path "../../../CMakeLists.txt"
            version "3.22.1+"
        }
    }
    namespace 'org.dolphinemu.dolphinemu'

    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_static", "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
                // , "-DENABLE_GENERIC=ON"
                abiFilters "arm64-v8a", "x86_64" //, "armeabi-v7a", "x86"

                // Remove the line below if you want to build the C++ unit tests
                //targets "main", "hook_impl", "main_hook", "gsl_alloc_hook", "file_redirect_hook"
            }
        }
    }

    packagingOptions {
        jniLibs.useLegacyPackaging = true
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'

    implementation 'androidx.core:core-ktx:1.10.1'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.exifinterface:exifinterface:1.3.6'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.1'
    implementation 'androidx.fragment:fragment:1.6.0'
    implementation 'androidx.slidingpanelayout:slidingpanelayout:1.2.0'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.core:core-splashscreen:1.0.1'
    implementation 'androidx.preference:preference:1.2.0'
    implementation 'androidx.profileinstaller:profileinstaller:1.3.1'

    // Kotlin extensions for lifecycle components
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'

    // Android TV UI libraries.
    implementation 'androidx.leanback:leanback:1.0.0'
    implementation 'androidx.tvprovider:tvprovider:1.0.0'

    // For REST calls
    implementation 'com.android.volley:volley:1.2.1'

    // For loading game covers from disk and GameTDB
    implementation 'io.coil-kt:coil:2.2.2'

    // For loading custom GPU drivers
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"

    implementation 'com.nononsenseapps:filepicker:4.2.1'
}

def getVersion() {
    def versionNumber = '0.0'

    try {
        versionNumber = 'git describe --always --long'.execute([], project.rootDir).text
                .trim()
                .replaceAll(/(-0)?-[^-]+$/, "")
    } catch (Exception e) {
        logger.error(e + ': Cannot find git, defaulting to dummy version number')
    }

    return versionNumber
}

def getBuildVersionCode() {
    try {
        def versionNumber = 'git rev-list --first-parent --count HEAD'.execute([], project.rootDir).text
                .trim()
        return Integer.valueOf(versionNumber)
    } catch (Exception e) {
        logger.error(e + ': Cannot find git, defaulting to dummy version number')
    }

    return 1
}

def getGitHash() {
    try {
        def gitHash = 'git rev-parse HEAD'.execute([], project.rootDir).text.trim()
        return gitHash
    } catch (Exception e) {
        logger.error(e + ': Cannot find git, defaulting to dummy build hash')
    }

    return 0
}

def getBranch() {
    try {
        def branch = 'git rev-parse --abbrev-ref HEAD'.execute([], project.rootDir).text.trim()
        return branch
    } catch (Exception e) {
        logger.error(e + ': Cannot find git, defaulting to dummy build hash')
    }

    return 'master'
}