apply plugin: 'com.android.application'

import groovy.json.JsonSlurper

def appPackage = new JsonSlurper().parse(file('../../package.json'))
def appVersion = appPackage.version as String
def versionCodeOverride = System.getenv('ANDROID_VERSION_CODE')
def versionMatcher = appVersion =~ /^(\d+)\.(\d+)(?:\.(\d+))?(?:-(alpha|beta|rc)(?:[.-]?(\d+))?)?(?:\+[0-9A-Za-z.-]+)?$/
if (!versionMatcher.matches()) {
    throw new GradleException("Unsupported Android version '${appVersion}'; use major.minor[.patch][-alpha|beta|rcN]")
}
def versionMajor = versionMatcher.group(1) as Long
def versionMinor = versionMatcher.group(2) as Long
def versionPatch = versionMatcher.group(3) == null ? 0L : versionMatcher.group(3) as Long
if (versionMajor > 20 || versionMinor > 999 || versionPatch > 999) {
    throw new GradleException("Android version '${appVersion}' exceeds the supported 20.999.999 range")
}
def prereleaseKind = versionMatcher.group(4)
def prereleaseNumber = versionMatcher.group(5) == null ? 1L : versionMatcher.group(5) as Long
def prereleaseRank = 99L
if (prereleaseKind != null) {
    def prereleaseLimit = prereleaseKind == 'alpha' ? 29L : prereleaseKind == 'beta' ? 30L : 39L
    if (prereleaseNumber < 1 || prereleaseNumber > prereleaseLimit) {
        throw new GradleException("Android ${prereleaseKind} number must be between 1 and ${prereleaseLimit}")
    }
    if (prereleaseKind == 'alpha') prereleaseRank = prereleaseNumber
    if (prereleaseKind == 'beta') prereleaseRank = 29 + prereleaseNumber
    if (prereleaseKind == 'rc') prereleaseRank = 59 + prereleaseNumber
}
def derivedVersionCode = versionMajor * 100_000_000 + versionMinor * 100_000 + versionPatch * 100 + prereleaseRank
def appVersionCode = derivedVersionCode as Integer
if (versionCodeOverride != null) {
    if (!(versionCodeOverride ==~ /^\d+$/)) {
        throw new GradleException('ANDROID_VERSION_CODE must be a positive integer')
    }
    def parsedOverride = versionCodeOverride as Long
    if (parsedOverride < 1 || parsedOverride > 2_100_000_000) {
        throw new GradleException('ANDROID_VERSION_CODE must be between 1 and 2100000000')
    }
    appVersionCode = parsedOverride as Integer
}
def releaseKeystore = System.getenv('ANDROID_KEYSTORE_FILE')
def requireReleaseSigning = System.getenv('REQUIRE_ANDROID_SIGNING') == '1'

android {
    namespace = "lv.carp.partscomparator"
    compileSdk = rootProject.ext.compileSdkVersion
    defaultConfig {
        applicationId "lv.carp.partscomparator"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode appVersionCode
        versionName appVersion
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        aaptOptions {
             // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
             // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
            ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
        }
    }
    signingConfigs {
        if (releaseKeystore) {
            release {
                storeFile file(releaseKeystore)
                storePassword System.getenv('ANDROID_KEYSTORE_PASSWORD')
                keyAlias System.getenv('ANDROID_KEY_ALIAS')
                keyPassword System.getenv('ANDROID_KEY_PASSWORD')
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (releaseKeystore) {
                signingConfig signingConfigs.release
            } else if (requireReleaseSigning) {
                throw new GradleException('Android release signing is required but ANDROID_KEYSTORE_FILE is missing')
            }
        }
    }
}

repositories {
    flatDir{
        dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
    implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
    implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
    implementation project(':capacitor-android')
    testImplementation "junit:junit:$junitVersion"
    androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
    androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
    implementation project(':capacitor-cordova-android-plugins')
}

apply from: 'capacitor.build.gradle'

try {
    def servicesJSON = file('google-services.json')
    if (servicesJSON.text) {
        apply plugin: 'com.google.gms.google-services'
    }
} catch(Exception e) {
    logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}

tasks.register('verifyDebugLauncherClass') {
    dependsOn 'compileDebugJavaWithJavac'
    doLast {
        def launcher = file("$buildDir/intermediates/javac/debug/compileDebugJavaWithJavac/classes/lv/carp/partscomparator/MainActivity.class")
        if (!launcher.exists()) throw new GradleException("Debug launcher class was not compiled: $launcher")
    }
}

tasks.register('verifyReleaseLauncherClass') {
    dependsOn 'compileReleaseJavaWithJavac'
    doLast {
        def launcher = file("$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/lv/carp/partscomparator/MainActivity.class")
        if (!launcher.exists()) throw new GradleException("Release launcher class was not compiled: $launcher")
    }
}

tasks.configureEach {
    if (name == 'assembleDebug') dependsOn 'verifyDebugLauncherClass'
    if (name == 'assembleRelease') dependsOn 'verifyReleaseLauncherClass'
}
