buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

repositories {
    jcenter()
    maven { url 'http://wordpress-mobile.github.io/WordPress-Android' }
    maven { url 'https://maven.fabric.io/public' }
    maven { url "https://jitpack.io" }
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

android {
    useLibrary 'org.apache.http.legacy'

    dexOptions {
        jumboMode = true
        javaMaxHeapSize = "6g"
        dexInProcess = true
    }

    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "org.wordpress.android"
        versionName "6.0-rc-1"
        versionCode 308
        minSdkVersion 16
        targetSdkVersion 24

        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
    }

    productFlavors {
        vanilla {} // used for release and beta

        zalpha { // alpha version - enable experimental features
            applicationId "org.wordpress.android"
        }

        wasabi { // "hot" version, can be installed along release, alpha or beta versions
            applicationId "org.wordpress.android.beta"
            minSdkVersion 21 // to take advantage of "fast" multi dex (pre-dex each module)
        }
    }

    buildTypes {
        release {
            // Proguard is used to shrink our apk, and reduce the number of methods in our final apk,
            // but we don't obfuscate the bytecode.
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
        }

        debug {
            minifyEnabled false
            buildConfigField "String", "APP_PN_KEY", "\"org.wordpress.android.debug.build\""
            ext.enableCrashlytics = false
        }
    }
}

dependencies {
    compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
        transitive = true;
    }

    // Provided by maven central
    compile ('org.wordpress:mediapicker:1.2.4') {
        exclude group:'com.android.support'
    }
    compile 'com.google.code.gson:gson:2.6.+'
    compile 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'

    compile 'com.android.support:support-compat:24.2.1'
    compile 'com.android.support:support-core-ui:24.2.1'
    compile 'com.android.support:support-fragment:24.2.1'

    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:cardview-v7:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.android.support:percent:24.2.1'

    compile 'com.google.android.gms:play-services-gcm:9.0.2'
    compile 'com.google.android.gms:play-services-auth:9.0.2'
    compile 'com.github.chrisbanes.photoview:library:1.2.4'
    compile 'com.helpshift:android-helpshift-aar:4.7.0'
    compile 'de.greenrobot:eventbus:2.4.0'
    compile 'com.automattic:rest:1.0.7'
    compile 'org.wordpress:graphview:3.4.0'
    compile 'org.wordpress:persistentedittext:1.0.1'
    compile 'org.wordpress:emailchecker2:1.1.0'

    compile 'com.yalantis:ucrop:2.2.0'
    compile 'com.github.xizzhu:simple-tool-tip:0.5.0'

    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'
    androidTestCompile 'org.objenesis:objenesis:2.1'
    androidTestCompile 'org.mockito:mockito-core:+'
    androidTestCompile 'com.squareup.okhttp:mockwebserver:2.7.5'
    androidTestCompile 'com.squareup.okio:okio:1.9.0' // explicitly compile okio to match the version needed by ucrop

    // Provided by the WordPress-Android Repository
    compile 'org.wordpress:drag-sort-listview:0.6.1' // not found in maven central
    compile 'org.wordpress:slidinguppanel:1.0.0' // not found in maven central
    compile 'org.wordpress:passcodelock:1.3.0'

    // Simperium
    compile 'com.simperium.android:simperium:0.6.8'

    releaseCompile project(path:':libs:utils:WordPressUtils', configuration: 'release')
    debugCompile project(path:':libs:utils:WordPressUtils', configuration: 'debug')
    releaseCompile project(path:':libs:networking:WordPressNetworking', configuration: 'release')
    debugCompile project(path:':libs:networking:WordPressNetworking', configuration: 'debug')
    releaseCompile project(path:':libs:analytics:WordPressAnalytics', configuration: 'release')
    debugCompile project(path:':libs:analytics:WordPressAnalytics', configuration: 'debug')
    releaseCompile project(path:':libs:editor:WordPressEditor', configuration: 'release')
    debugCompile project(path:':libs:editor:WordPressEditor', configuration: 'debug')
}

configurations.all {
    // Exclude packaged wordpress sub projects, force the use of the source project
    // (eg. use :libs:utils:WordPressUtils instead of 'org.wordpress:utils')
    exclude group: 'org.wordpress', module: 'utils'
    exclude group: 'org.wordpress', module: 'analytics'
}

task generateCrashlyticsConfig(group: "generate", description: "Generate Crashlytics config") {
    def outputFile = new File("${rootDir}/WordPress/crashlytics.properties")
    def inputFile = file("${rootDir}/WordPress/gradle.properties")
    if (!inputFile.exists()) {
        throw new StopActionException("Build configuration file:" + inputFile
                + " doesn't exist, follow README instructions")
    }
    outputs.file outputFile
    inputs.file inputFile
    doLast {
        def properties = new Properties()
        inputFile.withInputStream { stream ->
            properties.load(stream)
        }
        def crashlyticsApiKey = properties.getProperty('wp.crashlytics.apikey', '0')
        def writer = new FileWriter(outputFile)
        writer.write("""// auto-generated file from ${rootDir}/gradle.properties do not modify
apiKey=${crashlyticsApiKey}""")
        writer.close()
    }
}

// Add generateCrashlyticsConfig to all generateBuildConfig tasks (all variants)
android.applicationVariants.all { variant ->
    variant.generateBuildConfig.dependsOn(generateCrashlyticsConfig)
}

// Add properties named "wp.xxx" to our BuildConfig
android.buildTypes.all { buildType ->
    project.properties.any { property ->
        if (property.key.toLowerCase().startsWith("wp.")) {
            buildType.buildConfigField "String", property.key.replace("wp.", "").replace(".", "_").toUpperCase(),
                    "\"${property.value}\""
        }
    }
}

// For app signing
if (["storeFile", "storePassword", "keyAlias", "keyPassword"].count { !project.hasProperty(it) } == 0) {
    android {
        signingConfigs {
            release {
                storeFile = file(project.storeFile)
                storePassword = project.storePassword
                keyAlias = project.keyAlias
                keyPassword = project.keyPassword
            }
        }
    }
    android.buildTypes.release.signingConfig = android.signingConfigs.release
}
