apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'maven-publish'

// Import autolinking script
apply from: "../scripts/autolinking.gradle"

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

  // Remove this check, but keep the contents after SDK49 support is dropped
  if (safeExtGet("expoProvidesDefaultConfig", false)) {
    useExpoPublishing()
  }
}

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

def getRNVersion() {
  def nodeModulesVersion = [
      "node",
      "-e",
      "console.log(require('react-native/package.json').version);"
  ]
      .execute(null, projectDir)
      .text
      .trim()

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

  return versionToNumber(
      major,
      minor,
      patch
  )
}

ensureDependeciesWereEvaluated(project)

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

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
  }

  // Ensures backward compatibility
  ext.getKotlinVersion = {
    if (ext.has("kotlinVersion")) {
      ext.kotlinVersion()
    } else {
      ext.safeExtGet("kotlinVersion", "1.8.10")
    }
  }

  repositories {
    mavenCentral()
  }

  dependencies {
    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinVersion()}")
  }
}

// Remove this if and it's contents, when support for SDK49 is dropped
if (!safeExtGet("expoProvidesDefaultConfig", false)) {
  afterEvaluate {
    publishing {
      publications {
        release(MavenPublication) {
          from components.release
        }
      }
      repositories {
        maven {
          url = mavenLocal().url
        }
      }
    }
  }
}

android {
  // Remove this if and it's contents, when support for SDK49 is dropped
  if (!safeExtGet("expoProvidesDefaultConfig", false)) {
    compileSdkVersion safeExtGet("compileSdkVersion", 34)

    defaultConfig {
      minSdkVersion safeExtGet("minSdkVersion", 23)
      targetSdkVersion safeExtGet("targetSdkVersion", 34)
    }

    publishing {
      singleVariant("release") {
        withSourcesJar()
      }
    }

    lintOptions {
      abortOnError false
    }
  }

  def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
  if (agpVersion.tokenize('.')[0].toInteger() < 8) {
    compileOptions {
      sourceCompatibility JavaVersion.VERSION_11
      targetCompatibility JavaVersion.VERSION_11
    }

    kotlinOptions {
      jvmTarget = JavaVersion.VERSION_11.majorVersion
    }
  }

  namespace "expo.core"
  defaultConfig {
    versionCode 1
    versionName "50.0.21"
    consumerProguardFiles("proguard-rules.pro")
  }
  testOptions {
    unitTests.includeAndroidResources = true
  }

  sourceSets {
    main {
      java {
        srcDirs += new File(project.buildDir, generatedFilesSrcDir)

        def rnVersion = getRNVersion()
        if (rnVersion >= versionToNumber(0, 71, 0)) {
          srcDirs += "src/reactNativeHostWrapper"
        } else if (rnVersion >= versionToNumber(0, 69, 0)) {
          srcDirs += "src/reactNativeHostWrapper69"
        } else if (rnVersion >= versionToNumber(0, 67, 0)) {
          srcDirs += "src/reactNativeHostWrapper67"
        } else {
          srcDirs += "src/reactNativeHostWrapper64"
        }
      }
    }
  }
}

dependencies { dependencyHandler ->
  implementation 'com.facebook.react:react-android'

  testImplementation 'junit:junit:4.13.2'
  testImplementation 'androidx.test:core:1.5.0'
  testImplementation "com.google.truth:truth:1.1.2"
  testImplementation 'io.mockk:mockk:1.13.5'

  // Link expo modules as dependencies of the adapter. It uses `api` configuration so they all will be visible for the app as well.
  // A collection of the dependencies depends on the options passed to `useExpoModules` in your project's `settings.gradle`.
  addExpoModulesDependencies(dependencyHandler, project)
}

// A task generating a package list of expo modules.
task generateExpoModulesPackageList {
  def modulesConfig = getModulesConfig()
  def outputPath = getGenerateExpoModulesPackagesListPath()
  if (modulesConfig) {
    outputs.file(file(outputPath))
    inputs.property("modulesConfig", modulesConfig)
  }

  doLast {
    generateExpoModulesPackageList()
  }
}

// Run that task during prebuilding phase.
preBuild.dependsOn "generateExpoModulesPackageList"
