if (!hasProperty("rnta_node_gradle")) {
    apply(from: "${buildscript.sourceFile.getParent()}/node.gradle")
}
if (!hasProperty("rnta_react_native_gradle")) {
    apply(from: "${buildscript.sourceFile.getParent()}/react-native.gradle")
}

def getDependencyVersionFromCatalog = { String versionCatalog, String dependency, String fallback ->
    if (versionCatalog == null) {
        return fallback
    }

    def m = versionCatalog =~ /${dependency} = "([.0-9]+)"/
    return m.size() > 0 ? m[0][1] : fallback
}

def getDependencyVersionNumberFromCatalog = { String versionCatalog, String dependency, int fallback ->
    def version = getDependencyVersionFromCatalog(versionCatalog, dependency, null)
    return version != null ? Integer.parseInt(version) : fallback
}

def getKotlinVersion = { String versionCatalog ->
    def version = getDependencyVersionFromCatalog(versionCatalog, "kotlin", "1.7.21")
    logger.info("Using Kotlin version ${version}")
    return version
}

def getVersionCatalog = { File baseDir ->
    def packagePath = findNodeModulesPath("react-native", baseDir)
    def versionCatalog = file("${packagePath}/gradle/libs.versions.toml")
    if (!versionCatalog.exists()) {
        return null
    }

    return versionCatalog.text
}

ext {
    reactNativeVersion = getPackageVersionNumber("react-native", rootDir)

    def versionCatalog = getVersionCatalog(rootDir)

    compileSdkVersion = rootProject.findProperty("react.compileSdkVersion")
        ?: getDependencyVersionNumberFromCatalog(versionCatalog, "compileSdk", 34)
    minSdkVersion = rootProject.findProperty("react.minSdkVersion")
        ?: getDependencyVersionNumberFromCatalog(versionCatalog, "minSdk", 24)
    targetSdkVersion = rootProject.findProperty("react.targetSdkVersion")
        ?: getDependencyVersionNumberFromCatalog(versionCatalog, "targetSdk", 33)

    enableNewArchitecture = isNewArchitectureEnabled(project)
    enableBridgeless = isBridgelessEnabled(project, enableNewArchitecture)

    kotlinVersion = rootProject.findProperty("KOTLIN_VERSION") ?: getKotlinVersion(versionCatalog)

    // We need only set `ndkVersion` when building react-native from source.
    if (rootProject.hasProperty("ANDROID_NDK_VERSION")) {
        ndkVersion = rootProject.properties["ANDROID_NDK_VERSION"]
    } else {
        // https://github.com/facebook/react-native/commit/9ce7b564131c5b2075489c09ff05325ddc28014a
        ndkVersion = getDependencyVersionFromCatalog(versionCatalog, "ndkVersion", "26.1.10909125")
    }

    /**
     * Dependabot requires a `dependencies.gradle` to evaluate Java
     * dependencies. It is also very particular about the formatting and cannot
     * evaluate string literals.
     *
     * Hint: When making conditional changes, check whether the correct version
     * is set with `./gradlew app:dependencies`.
     *
     * See https://github.com/dependabot/feedback/issues/345.
     */
    libraries = [
        androidAppCompat            : "androidx.appcompat:appcompat:1.7.1",
        androidCamera               : "androidx.camera:camera-camera2:1.4.2",
        androidCameraMlKitVision    : "androidx.camera:camera-mlkit-vision:1.4.2",
        androidCoreKotlinExtensions : "androidx.core:core-ktx:1.16.0",
        androidRecyclerView         : "androidx.recyclerview:recyclerview:1.4.0",
        materialComponents          : "com.google.android.material:material:1.12.0",
        mlKitBarcodeScanning        : "com.google.mlkit:barcode-scanning:17.3.0",
    ]

    getReactNativeDependencies = {
        // Hint: Use `./gradlew buildEnvironment` to check whether these are
        // correctly set.
        return [
          "com.android.tools.build:gradle",
          "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}",
          "de.undercouch:gradle-download-task:5.6.0",
          "com.facebook.react:react-native-gradle-plugin",
        ]
    }
}
