import java.io.File
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.named
import org.gradle.kotlin.dsl.project
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.withType

public class R8NonJava8TestConventionPlugin : Plugin<Project> {
  override fun apply(target: Project) {
    target.dependencies.apply {
      add("implementation", project(":main", "mainClassesOutput"))
      add("implementation", project(":main", "mainResources"))
      add("implementation", project(":main", "turboClassesOutput"))
      add("implementation", project(":testbase"))
      add("implementation", project(":testbase", "depsJar"))
      add("runtimeOnlyDataScope", project(":testbase", "runtimeOnlyDataElements"))
    }

    val sharedDepsScope = target.configurations.dependencyScope("sharedDepsScope")
    val sharedDepsConfig =
      target.configurations.resolvable("sharedDepsConfig") { extendsFrom(sharedDepsScope.get()) }
    target.dependencies.add(
      sharedDepsScope.name,
      target.dependencies.project(":third_party", "sharedDepsFiles"),
    )
    target.tasks.withType<JavaCompile>().configureEach { dependsOn(sharedDepsConfig) }
    target.tasks.withType<Test>().configureEach {
      TestingState.setUpTestingState(this)
      systemProperty(
        "TEST_DATA_LOCATION",
        target.layout.buildDirectory.dir("classes/java/test").get().toString(),
      )
      systemProperty(
        "TESTBASE_DATA_LOCATION",
        target
          .project(":testbase")
          .tasks
          .named<JavaCompile>("compileJava")
          .get()
          .outputs
          .files
          .asPath
          .split(File.pathSeparator)[0],
      )
    }
    val assembleTestJar =
      target.tasks.register<Jar>("assembleTestJar") {
        val sourceSets = target.extensions.getByType<SourceSetContainer>()
        from(sourceSets.getByName("test").output)
        // TODO(b/296486206): Seems like IntelliJ has a problem depending on test source sets.
        // Renaming
        //  this from the default name (tests_java_8.jar) will allow IntelliJ to find the resources
        // in
        //  the jar and not show red underlines. However, navigation to base classes will not work.
        archiveFileName.set("not_named_tests_java.jar")
      }
    val testJar = target.configurations.consumable("testJar")
    target.artifacts { add(testJar.name, assembleTestJar) }
  }
}
