apply plugin: 'com.android.library'
apply plugin: 'kotlin-kapt'

group = 'host.exp.exponent'
version = '0.25.28'

def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
apply from: expoModulesCorePlugin
applyKotlinExpoModulesCorePlugin()
useCoreDependencies()
useDefaultAndroidSdkVersions()
useExpoPublishing()

// Utility method to derive boolean values from the environment or from Java properties,
// and return them as strings to be used in BuildConfig fields
def getBoolStringFromPropOrEnv(String name, Boolean defaultValue) {
  def env_value = System.getenv(name)
  def prop_value = findProperty(name)
  def value = defaultValue.toString()
  // If present, property value in gradle.properties overrides default
  if (prop_value != null) {
    value = boolish(prop_value).toString()
    println("expo-updates: Value of ${name} was overridden by property, new value = ${value}")
  }
  // If present, env value overrides default and gradle.properties
  if (env_value != null) {
    value = boolish(env_value).toString()
    println("expo-updates: Value of ${name} was overridden by environment, new value = ${value}")
  }
  return value
}

// If true, app will use bundled manifest and updates will be enabled, even for
// debug builds. (default false)
def exUpdatesNativeDebug = getBoolStringFromPropOrEnv("EX_UPDATES_NATIVE_DEBUG", false)

// If true, code will run that delays app loading until updates is initialized, to prevent ANR issues.
// (default true)
def exUpdatesAndroidDelayLoadApp = getBoolStringFromPropOrEnv("EX_UPDATES_ANDROID_DELAY_LOAD_APP", true)

def useDevClient = findProject(":expo-dev-client") != null

android {
  def rnVersion = getRNVersion()
  buildFeatures {
    buildConfig true
  }

  namespace "expo.modules.updates"
  defaultConfig {
    versionCode 31
    versionName '0.25.28'
    consumerProguardFiles(rnVersion >= versionToNumber(0, 75, 0) ? 'proguard-rules-75.pro' : 'proguard-rules.pro')
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    buildConfigField("boolean", "EX_UPDATES_NATIVE_DEBUG", exUpdatesNativeDebug)
    buildConfigField("boolean", "EX_UPDATES_ANDROID_DELAY_LOAD_APP", exUpdatesAndroidDelayLoadApp)
    buildConfigField("boolean", "USE_DEV_CLIENT", useDevClient.toString())

    // uncomment below to export the database schema when making changes
    /* javaCompileOptions {
      annotationProcessorOptions {
        arguments += ["room.schemaLocation":
                      "$projectDir/src/androidTest/schemas".toString()]
      }
    } */
  }
  testOptions {
    unitTests.includeAndroidResources = true

    packagingOptions {
      pickFirst "**/libfbjni.so"
      pickFirst "**/libc++_shared.so"
    }
  }
  sourceSets {
    main.assets.srcDirs += files("$projectDir/src/main/certificates".toString())
    androidTest.assets.srcDirs += files("$projectDir/src/androidTest/schemas".toString())
    androidTest.assets.srcDirs += files("$projectDir/src/androidTest/certificates".toString())

    if (rnVersion >= versionToNumber(0, 75, 0)) {
      main.java.srcDirs += "src/react-native-75/main"
    } else {
      main.java.srcDirs += "src/react-native-74/main"
    }
  }
}

dependencies {
  implementation project(':expo-structured-headers')
  implementation project(':expo-updates-interface')
  implementation project(':expo-manifests')
  implementation project(':expo-json-utils')
  implementation project(':expo-eas-client')
  implementation "com.facebook.react:react-android"

  def room_version = "2.6.1"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"

  implementation("com.squareup.okhttp3:okhttp:4.9.2")
  implementation("com.squareup.okhttp3:okhttp-urlconnection:4.9.2")
  implementation("com.squareup.okhttp3:okhttp-brotli:4.9.2")
  implementation("com.squareup.okio:okio:2.9.0")
  implementation("commons-codec:commons-codec:1.10")
  implementation("commons-io:commons-io:2.6")
  implementation("commons-fileupload:commons-fileupload:1.4")
  implementation("javax.portlet:portlet-api:3.0.1")
  implementation("javax.servlet:javax.servlet-api:4.0.1")
  implementation("org.apache.commons:commons-lang3:3.9")
  implementation("org.bouncycastle:bcutil-jdk15to18:1.70")

  testImplementation 'junit:junit:4.13.2'
  testImplementation 'androidx.test:core:1.4.0'
  testImplementation 'io.mockk:mockk:1.12.3'
  testImplementation "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVersion()}"

  androidTestImplementation 'androidx.test:runner:1.4.0'
  androidTestImplementation 'androidx.test:core:1.4.0'
  androidTestImplementation 'androidx.test:rules:1.4.0'
  androidTestImplementation 'io.mockk:mockk-android:1.12.3'
  androidTestImplementation "androidx.room:room-testing:$room_version"
  androidTestImplementation "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVersion()}"

  implementation "org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion()}"
}

def versionToNumber(major, minor, patch) {
  return patch * 100 + minor * 10000 + major * 1000000
}

def getNodeModulesPackageVersion(packageName, overridePropName) {
  def nodeModulesVersion = providers.exec {
    workingDir(projectDir)
    commandLine("node", "-e", "console.log(require('$packageName/package.json').version);")
  }.standardOutput.asText.get().trim()
  def version = safeExtGet(overridePropName, nodeModulesVersion)

  def coreVersion = version.split("-")[0]
  def (major, minor, patch) = coreVersion.tokenize('.').collect { it.toInteger() }

  return versionToNumber(
    major,
    minor,
    patch
  )
}

def getRNVersion() {
  return getNodeModulesPackageVersion("react-native", "reactNativeVersion")
}
