apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'io.fabric'
apply from: '../config/quality/quality.gradle'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "org.apache.fineract"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }

    buildTypes {

        debug {
            versionNameSuffix " Debug"
            debuggable true
        }

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

    sourceSets {
        def commonTestDir = 'src/commonTest/java'
        androidTest {
            java.srcDir commonTestDir
        }
        test {
            java.srcDir commonTestDir
        }
        main {
            java.srcDir commonTestDir
        }
    }

    // Always show the result of every unit test, even if it passes.
    testOptions.unitTests.all {
        testLogging {
            events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
        }
    }

    lintOptions {
        abortOnError false
        warning 'InvalidPackage'
    }

    packagingOptions {
        exclude 'META-INF/rxjava.properties'
    }

    //for @parcelize extension
    androidExtensions {
        experimental = true
    }
}

dependencies {

    def daggerCompiler = "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
    def jUnit = "junit:junit:$rootProject.junitVersion"
    def mockito = "org.mockito:mockito-core:$rootProject.mockitoVersion"

    // Support Dependencies
    implementation "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
    implementation "com.android.support:design:$rootProject.supportLibraryVersion"
    implementation "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
    implementation "com.android.support:cardview-v7:$rootProject.supportLibraryVersion"
    implementation "com.android.support.test.espresso:espresso-idling-resource:$rootProject.espressoVersion"
    implementation "com.android.support:support-annotations:$rootProject.supportLibraryVersion"

    // Kotlin Dependencies
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"

    //android-job
    implementation "com.evernote:android-job:$androidJobVersion"

    implementation "com.github.therajanmaurya:Sweet-Error:$rootProject.sweetErrorVersion"

    implementation "com.android.support:support-v4:$rootProject.supportLibraryVersion"
    kapt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflowVersion}"
    implementation "com.github.Raizlabs.DBFlow:dbflow-core:${dbflowVersion}"
    implementation "com.github.Raizlabs.DBFlow:dbflow:${dbflowVersion}"
    implementation "com.github.Raizlabs.DBFlow:dbflow-rx2:${dbflowVersion}"

    // Rx Dependencies
    implementation "io.reactivex.rxjava2:rxjava:$rootProject.rxjavaVersion"
    implementation "io.reactivex.rxjava2:rxandroid:$rootProject.rxandroidVersion"
    implementation "io.reactivex.rxjava2:rxkotlin:$rootProject.rxKotlinVersion"

    // Square Dependencies
    implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"
    implementation "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion"
    implementation "com.squareup.retrofit2:converter-scalars:$rootProject.retrofitVersion"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$rootProject.retrofitVersion"
    implementation "com.squareup.okhttp3:okhttp:$rootProject.okHttp3Version"
    implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.okHttp3Version"

    //Glide for loading the images
    implementation "com.github.bumptech.glide:glide:$rootProject.glideVersion"
    implementation "de.hdodenhof:circleimageview:$rootProject.circleImageviewVersion"

    // Dagger 2 Dependencies
    implementation "com.google.dagger:dagger:$rootProject.daggerVersion"
    compileOnly 'org.glassfish:javax.annotation:10.0-b28' //Required by Dagger2
    kapt daggerCompiler
//    testkapt daggerCompiler
//    androidTestkapt daggerCompiler

    // ButterKnife Dependencies
    implementation "com.jakewharton:butterknife:$rootProject.butterKnifeVersion"
    kapt "com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion"

    // Fabric Crashlytics Dependencies
    implementation('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
        transitive = true
    }

    //Sticky header RecyclerView
    implementation "org.zakariya.stickyheaders:stickyheaders:$rootProject.sticyHeaderVersion"

    // Compressor for Image Compression
    implementation "id.zelory:compressor:$rootProject.compressorVersion"

    //Material Stepper UI library
    implementation "com.stepstone.stepper:material-stepper:$rootProject.materialStepperVersion"

    // Instrumentation test dependencies
    androidTestImplementation jUnit
    androidTestImplementation mockito
    androidTestImplementation "org.mockito:mockito-android:$rootProject.mockitoVersion"
    androidTestImplementation "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
    androidTestImplementation("com.android.support.test.espresso:espresso-contrib:$rootProject.espressoVersion") {
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude group: 'com.android.support', module: 'recyclerview-v7'
        exclude group: 'com.android.support', module: 'design'
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestImplementation "com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion"
    androidTestImplementation "com.android.support.test:runner:$rootProject.runnerVersion"
    androidTestImplementation "com.android.support.test:rules:$rootProject.rulesVersion"

    // Unit tests dependencies
    testImplementation jUnit
    testImplementation mockito
    testImplementation "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
    testImplementation "org.hamcrest:hamcrest-core:$rootProject.hamcrestVersion"
    testImplementation "org.hamcrest:hamcrest-library:$rootProject.hamcrestVersion"
    testImplementation "org.hamcrest:hamcrest-integration:$rootProject.hamcrestVersion"
    testImplementation "org.robolectric:robolectric:$rootProject.roboElectricVersion"

}

// Log out test results to console
tasks.matching { it instanceof Test }.all {
    testLogging.events = ["failed", "passed", "skipped"]
}

/*
    Resolves dependency versions across test and production APKs, specifically, transitive
    dependencies. This is required since Espresso internally has a dependency on support-annotations.
    */
configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
        force 'com.google.code.findbugs:jsr305:1.3.9'
    }
}

/*
    All direct/transitive dependencies shared between your test and production APKs need to be
    excluded from the test APK! This is necessary because both APKs will contain the same classes. Not
    excluding these dependencies from your test configuration will result in an dex pre-verifier error
    at runtime. More info in this tools bug: (https://code.google.com/p/android/issues/detail?id=192497)
    */
configurations.compile.dependencies.each { compileDependency ->
    println "Excluding compile dependency: ${compileDependency.getName()}"
    configurations.androidTestCompile.dependencies.each { androidTestCompileDependency ->
        configurations.androidTestCompile.exclude module: "${compileDependency.getName()}"
    }
}
repositories {
    mavenCentral()
}
