apply plugin: 'com.android.library'

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

buildscript {
  // Simple helper that allows the root project to override versions declared by this library.
  ext.safeExtGet = { prop, fallback ->
    rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
  }
}

android {
  namespace "expo.modules.devlauncher"
  defaultConfig {
    versionCode 9
    versionName "5.0.30"
  }

  buildTypes {
    buildTypes.each {
      it.buildConfigField 'String', 'VERSION', "\"${defaultConfig.versionName}\""
    }

    releaseWithDevLauncher {
      initWith release
      matchingFallbacks = ['release', 'debug']
    }
  }

  sourceSets {
    def rnVersion = getRNVersion()
    main {
      java {
        if (rnVersion >= versionToNumber(0, 77, 0)) {
          srcDirs += "src/rn77/main"
        } else if (rnVersion >= versionToNumber(0, 74, 0)) {
          // TODO(kudo,20241112): Remove this when we drop react-native 0.76 support
          srcDirs += "src/rn74/main"
        }
      }
    }
    debug {
      java {
        if (rnVersion >= versionToNumber(0, 77, 0)) {
          srcDirs += "src/rn77/debug"
        } else if (rnVersion >= versionToNumber(0, 74, 0)) {
          // TODO(kudo,20241112): Remove this when we drop react-native 0.76 support
          srcDirs += "src/rn74/debug"
        }
      }
    }
    releaseWithDevLauncher {
      setRoot 'src/debug'
    }
  }

  buildFeatures {
    buildConfig true
    viewBinding true
  }
}

repositories {
  // ref: https://www.baeldung.com/maven-local-repository
  mavenLocal()
  maven {
    // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
    url "$rootDir/../node_modules/react-native/android"
  }
  maven {
    // Android JSC is installed from npm
    url "$rootDir/../node_modules/jsc-android/dist"
  }
  google()
}

dependencies {
  implementation project(":expo-dev-menu-interface")
  implementation project(":expo-manifests")
  implementation project(":expo-updates-interface")
  implementation project(":expo-dev-menu")

  implementation 'com.facebook.react:react-android'
  implementation 'com.facebook.soloader:soloader:0.11.0'

  implementation 'commons-io:commons-io:2.6'

  implementation 'com.squareup.okhttp3:okhttp:3.14.9'
  implementation 'com.google.code.gson:gson:2.8.6'

  // Fixes
  // Cannot access 'androidx....' which is a supertype of 'expo.modules.devmenu.DevMenuActivity'.
  // Check your module classpath for missing or conflicting dependencies
  api "androidx.appcompat:appcompat:1.1.0"
  api "androidx.lifecycle:lifecycle-extensions:2.2.0"

  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3")
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1")
  implementation "org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion()}"

  def koinVersion = "3.4.0"

  api "io.insert-koin:koin-core:${koinVersion}"

  testImplementation 'androidx.test:core:1.4.0'
  testImplementation 'androidx.test:core-ktx:1.4.0'
  testImplementation "com.google.truth:truth:1.1.2"
  testImplementation 'com.squareup.okhttp3:mockwebserver:4.3.1'
  testImplementation "io.insert-koin:koin-test:${koinVersion}"
  testImplementation "io.insert-koin:koin-test-junit4:${koinVersion}"
  testImplementation 'io.mockk:mockk:1.12.3'
  testImplementation "org.robolectric:robolectric:4.10"
}

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")
}
