import com.android.build.OutputFile

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.oss-licenses-plugin'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

kapt {
    correctErrorTypes = true
}

androidExtensions {
    experimental = true
}

ext.versionMajor = 0
ext.versionMinor = 3
ext.versionPatch = 0

static def getGitTimestamp() {
    def cmd = 'git show -s --format=%ct'
    return cmd.execute().text.trim() as Long
}

static def generateVersionCodeFromTimestamp() {
    // It's unix timestamp divided by 10: It's incremented by one every 10 seconds.
    return (getGitTimestamp() / 10).toInteger()
}

def generateVersionCodeFromVersionName() {
    return versionMajor * 10000 + versionMinor * 100 + versionPatch
}

static def gitRevision() {
    def cmd = "git rev-parse --short HEAD"
    return cmd.execute().text.trim()
}

static def gitRevisionDate() {
    def cmd = "git show -s --format=%ci HEAD^{commit}"
    return cmd.execute().text.trim()
}

static def gitBranchName() {
    def cmd = "git name-rev --name-only HEAD"
    return cmd.execute().text.trim()
}

project.android.buildTypes.all { buildType ->
    buildType.javaCompileOptions.annotationProcessorOptions.arguments =
            [
                    validateEpoxyModelUsage: String.valueOf(buildType.name == 'debug')
            ]
}

// map for the version codes
// x86 must have greater values than arm, see https://software.intel.com/en-us/android/articles/google-play-supports-cpu-architecture-filtering-for-multiple-apk
// 64 bits have greater value than 32 bits
ext.abiVersionCodes = ["armeabi-v7a": 1, "arm64-v8a": 2, "x86": 3, "x86_64": 4].withDefault { 0 }

def buildNumber = System.getenv("BUILDKITE_BUILD_NUMBER") as Integer ?: 0

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "im.vector.riotx"
        // Set to API 19 because motionLayout is min API 18.
        // In the future we may consider using an alternative of MotionLayout to support API 16. But for security reason, maybe not.
        minSdkVersion 19
        targetSdkVersion 28
        multiDexEnabled true

        // Note: versionCode is depending on the build variant

        versionName "${versionMajor}.${versionMinor}.${versionPatch}-dev"

        buildConfigField "String", "GIT_REVISION", "\"${gitRevision()}\""
        resValue "string", "git_revision", "\"${gitRevision()}\""

        buildConfigField "String", "GIT_REVISION_DATE", "\"${gitRevisionDate()}\""
        resValue "string", "git_revision_date", "\"${gitRevisionDate()}\""

        buildConfigField "String", "GIT_BRANCH_NAME", "\"${gitBranchName()}\""
        resValue "string", "git_branch_name", "\"${gitBranchName()}\""

        buildConfigField "String", "BUILD_NUMBER", "\"${buildNumber}\""
        resValue "string", "build_number", "\"${buildNumber}\""

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        // Keep abiFilter for the universalApk
        ndk {
            abiFilters "armeabi-v7a", "x86", 'arm64-v8a', 'x86_64'
        }

        // Ref: https://developer.android.com/studio/build/configure-apk-splits.html
        splits {
            // Configures multiple APKs based on ABI.
            abi {
                // Enables building multiple APKs per ABI.
                enable true

                // By default all ABIs are included, so use reset() and include to specify that we only
                // want APKs for armeabi-v7a, x86, arm64-v8a and x86_64.

                // Resets the list of ABIs that Gradle should create APKs for to none.
                reset()

                // Specifies a list of ABIs that Gradle should create APKs for.
                include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"

                // Generate a universal APK that includes all ABIs, so user who install from CI tool can use this one by default.
                universalApk true
            }
        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def baseAbiVersionCode = project.ext.abiVersionCodes.get(output.getFilter(OutputFile.ABI))
                // Known limitation: it does not modify the value in the BuildConfig.java generated file
                output.versionCodeOverride = baseAbiVersionCode * 10_000_000 + variant.versionCode
            }
        }
    }

    signingConfigs {
        debug {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('./signature/debug.keystore')
            storePassword 'android'
        }
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            resValue "string", "app_name", "RiotX dbg"

            resValue "bool", "debug_mode", "true"
            buildConfigField "boolean", "LOW_PRIVACY_LOG_ENABLE", "false"

            signingConfig signingConfigs.debug
        }

        release {
            resValue "string", "app_name", "RiotX"

            resValue "bool", "debug_mode", "false"
            buildConfigField "boolean", "LOW_PRIVACY_LOG_ENABLE", "false"

            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "store"

    productFlavors {
        gplay {
            dimension "store"

            versionCode = generateVersionCodeFromVersionName()

            buildConfigField "boolean", "ALLOW_FCM_USE", "true"
            buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"G\""
            buildConfigField "String", "FLAVOR_DESCRIPTION", "\"GooglePlay\""
        }

        fdroid {
            dimension "store"

            versionCode = generateVersionCodeFromTimestamp()

            buildConfigField "boolean", "ALLOW_FCM_USE", "false"
            buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"F\""
            buildConfigField "String", "FLAVOR_DESCRIPTION", "\"FDroid\""
        }
    }

    lintOptions {
        lintConfig file("lint.xml")
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    def epoxy_version = "3.7.0"
    def arrow_version = "0.8.2"
    def coroutines_version = "1.0.1"
    def markwon_version = '3.0.0'
    def big_image_viewer_version = '1.5.6'
    def glide_version = '4.9.0'
    def moshi_version = '1.8.0'
    def daggerVersion = '2.23.1'

    implementation project(":matrix-sdk-android")
    implementation project(":matrix-sdk-android-rx")
    implementation 'com.android.support:multidex:1.0.3'

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"

    implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
    //Do not use beta2 at the moment, as it breaks things
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta1'
    implementation 'androidx.core:core-ktx:1.0.2'

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1'
    implementation "com.squareup.moshi:moshi-adapters:$moshi_version"
    kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"

    // OSS License
    implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'

    // Log
    implementation 'com.jakewharton.timber:timber:4.7.1'

    // Debug
    implementation 'com.facebook.stetho:stetho:1.5.0'

    // rx
    implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    implementation 'com.jakewharton.rxrelay2:rxrelay:2.1.0'
    // RXBinding
    implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'
    implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0-alpha2'

    implementation("com.airbnb.android:epoxy:$epoxy_version")
    kapt "com.airbnb.android:epoxy-processor:$epoxy_version"
    implementation "com.airbnb.android:epoxy-paging:$epoxy_version"
    implementation 'com.airbnb.android:mvrx:1.0.1'

    // Work
    implementation "androidx.work:work-runtime-ktx:2.1.0-rc01"

    // Paging
    implementation "androidx.paging:paging-runtime-ktx:2.1.0"

    // Functional Programming
    implementation "io.arrow-kt:arrow-core:$arrow_version"

    // Pref
    implementation 'androidx.preference:preference:1.0.0'

    // UI
    implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
    implementation 'com.google.android.material:material:1.1.0-alpha08'
    implementation 'me.gujun.android:span:1.7'
    implementation "ru.noties.markwon:core:$markwon_version"
    implementation "ru.noties.markwon:html:$markwon_version"
    implementation 'me.saket:better-link-movement-method:2.2.0'

    // Passphrase strength helper
    implementation 'com.nulab-inc:zxcvbn:1.2.5'

    //Alerter
    implementation 'com.tapadoo.android:alerter:4.0.3'

    implementation 'com.otaliastudios:autocomplete:1.1.0'

    // Butterknife
    implementation 'com.jakewharton:butterknife:10.1.0'
    kapt 'com.jakewharton:butterknife-compiler:10.1.0'

    // Shake detection
    implementation 'com.squareup:seismic:1.0.2'

    // Image Loading
    implementation "com.github.piasy:BigImageViewer:$big_image_viewer_version"
    implementation "com.github.piasy:GlideImageLoader:$big_image_viewer_version"
    implementation "com.github.piasy:ProgressPieIndicator:$big_image_viewer_version"
    implementation "com.github.piasy:GlideImageViewFactory:$big_image_viewer_version"
    implementation "com.github.bumptech.glide:glide:$glide_version"
    kapt "com.github.bumptech.glide:compiler:$glide_version"
    implementation 'com.danikula:videocache:2.7.1'

    // Badge for compatibility
    implementation 'me.leolin:ShortcutBadger:1.1.2@aar'

    // File picker
    implementation 'com.github.jaiselrahman:FilePicker:1.2.2'

    // DI
    implementation "com.google.dagger:dagger:$daggerVersion"
    kapt "com.google.dagger:dagger-compiler:$daggerVersion"
    compileOnly 'com.squareup.inject:assisted-inject-annotations-dagger2:0.4.0'
    kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.4.0'

    // gplay flavor only
    gplayImplementation('com.google.firebase:firebase-messaging:19.0.1') {
        exclude group: 'com.google.firebase', module: 'firebase-core'
        exclude group: 'com.google.firebase', module: 'firebase-analytics'
        exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
    }

    implementation 'diff_match_patch:diff_match_patch:current'

    // TESTS
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

if (getGradle().getStartParameter().getTaskRequests().toString().contains("Gplay")) {
    apply plugin: 'com.google.gms.google-services'
}