tasks.configureEach { task ->
  // Make sure that we generate our prefab publication file only after having built the native library
  // so that not a header publication file, but a full configuration publication will be generated, which
  // will include the .so file

  def prefabConfigurePattern = ~/^prefab(.+)ConfigurePackage$/
  def matcher = task.name =~ prefabConfigurePattern
  if (matcher.matches()) {
    def variantName = matcher[0][1]
    task.outputs.upToDateWhen { false }
    task.dependsOn("externalNativeBuild${variantName}")
  }
}

afterEvaluate {
  def abis = reactNativeArchitectures()
  rootProject.allprojects.each { proj ->
    if (proj === rootProject) return

    def dependsOnThisLib = proj.configurations.findAll { it.canBeResolved }.any { config ->
      config.dependencies.any { dep ->
        dep.group == project.group && dep.name == project.name
      }
    }
    if (!dependsOnThisLib && proj != project) return

    if (!proj.plugins.hasPlugin('com.android.application') && !proj.plugins.hasPlugin('com.android.library')) {
      return
    }

    def variants = proj.android.hasProperty('applicationVariants') ? proj.android.applicationVariants : proj.android.libraryVariants
    // Touch the prefab_config.json files to ensure that in ExternalNativeJsonGenerator.kt we will re-trigger the prefab CLI to
    // generate a libnameConfig.cmake file that will contain our native library (.so).
    // See this condition: https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ExternalNativeJsonGenerator.kt;l=207-219?q=createPrefabBuildSystemGlue
    variants.all { variant ->
      def variantName = variant.name
      abis.each { abi ->
        def searchDir = new File(proj.projectDir, ".cxx/${variantName}")
        if (!searchDir.exists()) return
        def matches = []
        searchDir.eachDir { randomDir ->
          def prefabFile = new File(randomDir, "${abi}/prefab_config.json")
          if (prefabFile.exists()) matches << prefabFile
        }
        matches.each { prefabConfig ->
          prefabConfig.setLastModified(System.currentTimeMillis())
        }
      }
    }
  }
}