plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'

    id 'com.google.gms.google-services'
    id 'com.google.firebase.crashlytics'
    id 'androidx.navigation.safeargs'
    id 'com.google.firebase.firebase-perf'
}

apply plugin: 'kotlin-android'
apply plugin: "realm-android"

repositories {
    mavenLocal()
    mavenCentral()
    google()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots" }

    maven { url "https://jitpack.io" }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: '../common/libs')
    //Networking
    implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
    implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
    //REST API handling
    implementation("com.squareup.retrofit2:retrofit:$retrofit_version") {
        exclude module: 'okhttp'
    }
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"

    //Dependency Injection
    implementation "com.google.dagger:dagger:$daggerhilt_version"
    kapt "com.google.dagger:dagger-compiler:$daggerhilt_version"
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
    //App Compatibility and Material Design
    implementation "androidx.appcompat:appcompat:$appcompat_version"
    implementation 'com.google.android.material:material:1.8.0'
    implementation "androidx.recyclerview:recyclerview:$recyclerview_version"
    implementation "androidx.preference:preference-ktx:$preferences_version"
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"

    //Desugaring
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2'

    implementation('com.jaredrummler:android-device-names:2.1.1')

    // IAP Handling / Verification
    implementation "com.android.billingclient:billing-ktx:5.1.0"
    implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar'

    implementation("io.coil-kt:coil-compose:$coil_version")

    //Analytics
    implementation "com.amplitude:analytics-android:$amplitude_version"

    //Tests
    testImplementation 'io.kotest:kotest-runner-junit5:5.5.5'
    testImplementation 'androidx.test:core:1.5.0'
    testImplementation 'io.mockk:mockk:1.13.4'
    testImplementation 'io.mockk:mockk-android:1.13.4'
    testImplementation 'io.kotest:kotest-assertions-core:5.5.5'
    testImplementation 'io.kotest:kotest-framework-datatest:5.5.5'
    androidTestImplementation ('com.kaspersky.android-components:kaspresso:1.5.1') {
        exclude module: "protobuf-lite"
    }
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation 'androidx.test:runner:1.5.2'
    androidTestImplementation 'androidx.test:rules:1.5.0'
    debugImplementation 'androidx.fragment:fragment-testing:1.5.5'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test:core-ktx:1.5.0'
    androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.5'
    androidTestImplementation 'io.mockk:mockk-android:1.13.4'
    androidTestImplementation 'io.kotest:kotest-assertions-core:5.5.5'
    androidTestUtil("androidx.test:orchestrator:1.4.2")

    implementation 'com.facebook.shimmer:shimmer:0.5.0'

    //Leak Detection
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
    //Push Notifications
    implementation platform("com.google.firebase:firebase-bom:$firebase_bom")
    implementation 'com.google.firebase:firebase-analytics-ktx'
    implementation 'com.google.firebase:firebase-crashlytics-ktx'
    implementation 'com.google.firebase:firebase-messaging-ktx'
    implementation 'com.google.firebase:firebase-config-ktx'
    implementation 'com.google.firebase:firebase-perf-ktx'
    implementation 'com.google.android.gms:play-services-ads:21.5.0'
    implementation "com.google.android.gms:play-services-auth:$play_auth_version"
    implementation 'com.google.android.flexbox:flexbox:3.0.0'
    implementation "com.google.android.gms:play-services-wearable:$play_wearables_version"

    implementation "androidx.core:core-ktx:$core_ktx_version"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
    implementation "androidx.fragment:fragment-ktx:1.5.5"
    implementation "androidx.paging:paging-runtime-ktx:3.1.1"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
    implementation "com.google.accompanist:accompanist-themeadapter-material:$accompanist_version"
    implementation "androidx.compose.material3:material3:1.0.1"
    implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version"

    implementation 'androidx.activity:activity-compose:1.6.1'
    implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
    implementation "androidx.compose.material:material:1.3.1"
    implementation "androidx.compose.animation:animation:$compose_version"
    implementation "androidx.compose.ui:ui-tooling:$compose_version"
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"

    implementation 'com.willowtreeapps:signinwithapplebutton:0.3'

    implementation project(':common')
    implementation project(':shared')

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

android {
    compileSdkVersion target_sdk
    buildToolsVersion '33.0.2'
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
        animationsDisabled = true
    }

    defaultConfig {
        minSdkVersion min_sdk
        applicationId "com.habitrpg.android.habitica"
        vectorDrawables.useSupportLibrary = true
        buildConfigField "String", "STORE", "\"google\""
        buildConfigField "String", "TESTING_LEVEL", "\"production\""
        resConfigs 'en', 'bg', 'de', 'en-rGB', 'es', 'fr', 'hr-rHR', 'in', 'it', 'iw', 'ja', 'ko', 'lt', 'nl', 'pl', 'pt-rBR', 'pt-rPT', 'ru', 'tr', 'uk', 'zh', 'zh-rTW'

        versionCode app_version_code
        versionName app_version_name

        targetSdkVersion target_sdk

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testInstrumentationRunnerArguments clearPackageData: 'true'

        def formattedDate = new Date().format('yyMMdd')
        archivesBaseName = "Habitica-${formattedDate}${versionCode}"
    }

    buildFeatures {
        viewBinding true
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.2"
    }

    signingConfigs {
        release
    }
    flavorDimensions "buildType"

    buildTypes {
        debug {
            //applicationIdSuffix ".debug"
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Disable fabric build ID generation for debug builds
            ext.enableCrashlytics = false
            ext.alwaysUpdateBuildId = false
            testCoverageEnabled = false
            //resValue "string", "content_provider", "com.habitrpg.android.habitica.debug.fileprovider"
            resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
            resValue "string", "app_name", "Habitica Debug"
        }
        debugIAP {
            signingConfig signingConfigs.release
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Disable fabric build ID generation for debug builds
            ext.enableCrashlytics = false
            ext.alwaysUpdateBuildId = false
            resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
            resValue "string", "app_name", "Habitica Debug"
        }
        release {
            signingConfig signingConfigs.release
            debuggable false
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
            resValue "string", "app_name", "Habitica"
        }
    }

    productFlavors {
        dev {
            dimension "buildType"
        }

        staff {
            dimension "buildType"
            buildConfigField "String", "TESTING_LEVEL", "\"staff\""
            resValue "string", "app_name", "Habitica Staff"
            versionCode app_version_code + 8
        }

        partners {
            dimension "buildType"
            buildConfigField "String", "TESTING_LEVEL", "\"partners\""
            resValue "string", "app_name", "Habitica"
            versionCode app_version_code + 6
        }

        alpha {
            dimension "buildType"
            buildConfigField "String", "TESTING_LEVEL", "\"alpha\""
            resValue "string", "app_name", "Habitica Alpha"
            versionCode app_version_code + 4
        }

        beta {
            buildConfigField "String", "TESTING_LEVEL", "\"beta\""
            dimension "buildType"
            versionCode app_version_code + 2
        }

        prod {
            buildConfigField "String", "TESTING_LEVEL", "\"production\""
            dimension "buildType"
            versionCode app_version_code
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            resources.srcDirs = ['src/main/java']
            aidl.srcDirs = ['src/main/java']
            renderscript.srcDirs = ['src/main/java']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        test {
            java.srcDir("src/test/java")
        }
        debugIAP { java.srcDirs = ['src/debug/java'] }
        release { java.srcDirs = ['src/release/java'] }
    }

    compileOptions {
        coreLibraryDesugaringEnabled true

        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    }


    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
    }
    lint {
        abortOnError false
        disable 'MissingTranslation', 'InvalidPackage'
        enable 'LogConditional', 'IconExpectedSize', 'MissingRegistered', 'TypographyQuotes'
    }
}

android.testOptions {
    unitTests.all {
        useJUnitPlatform()
        testLogging {
            events "passed", "skipped", "failed", "standardError"
            outputs.upToDateWhen {false}

            afterSuite { desc, result ->
                if (!desc.parent) { // will match the outermost suite
                    def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
                    def startItem = '|  ', endItem = '  |'
                    def repeatLength = startItem.length() + output.length() + endItem.length()
                    println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
                }
            }
        }
    }
    unitTests.returnDefaultValues = true
}

Properties props = new Properties()
def propFile = new File('signingrelease.properties')
if (propFile.canRead()) {
    props.load(new FileInputStream(propFile))

    if (props != null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
            props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
        android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
        android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
        android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
        android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
    } else {
        println 'signing.properties found but some entries are missing'
        android.buildTypes.release.signingConfig = null
    }
} else {
    println 'signing.properties not found'
    android.buildTypes.release.signingConfig = null
}

// Add Habitica Properties to buildConfigField
final File HRPG_PROPS_FILE = new File(projectDir.absolutePath + '/../habitica.properties')
if (HRPG_PROPS_FILE.canRead()) {
    Properties HRPG_PROPS = new Properties()
    HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE))

    if (HRPG_PROPS != null) {
        android.buildTypes.all { buildType ->
            HRPG_PROPS.any { property ->
                buildType.buildConfigField "String", property.key, "\"${property.value}\""
            }
        }
    } else {
        throw new MissingResourceException('habitica.properties found but some entries are missing')
    }
} else {
    throw new MissingResourceException('habitica.properties not found')
}

// Add Habitica Resources to resources
final File HRPG_RES_FILE = new File(projectDir.absolutePath + '/../habitica.resources')
if (HRPG_RES_FILE.canRead()) {
    Properties HRPG_RES = new Properties()
    HRPG_RES.load(new FileInputStream(HRPG_RES_FILE))

    if (HRPG_RES != null) {
        android.buildTypes.all { buildType ->
            HRPG_RES.any { property ->
                buildType.resValue "string", property.key, "\"${property.value}\""
            }
        }
    } else {
        throw new MissingResourceException('habitica.resources found but some entries are missing')
    }
} else {
    throw new MissingResourceException('habitica.resources not found')
}

tasks.whenTaskAdded { task ->
    if (task.name == "lint") {
        task.enabled = false
    }
}

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xmaxerrs" << "500"
    }
}

apply plugin: 'com.google.gms.google-services'