// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import java.nio.file.Paths
import org.gradle.api.logging.LogLevel.ERROR
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform


plugins {
  `kotlin-dsl`
  id("dependencies-plugin")
}

java {
  sourceCompatibility = JavaVersion.VERSION_17
  targetCompatibility = JavaVersion.VERSION_17
}

dependencies { }

val r8WithRelocatedDepsTask = projectTask("main", "r8WithRelocatedDeps")
val java8TestJarTask = projectTask("tests_java_8", "testJar")
val java8DepsJarTask = projectTask("tests_java_8", "depsJar")

tasks {
  withType<JavaCompile> {
    options.setFork(true)
    options.forkOptions.executable = getCompilerPath(Jdk.JDK_17)
    options.forkOptions.javaHome = getJavaHome(Jdk.JDK_17)
  }

  withType<KotlinCompile> {
    kotlinOptions {
      jvmTarget = "17"
    }
  }

  val allTestsJar by registering(Jar::class) {
    dependsOn(java8TestJarTask)
    from(java8TestJarTask.outputs.getFiles().map(::zipTree))
    exclude("META-INF/*.kotlin_module")
    exclude("**/*.kotlin_metadata")
    archiveFileName.set("all-tests.jar")
  }

  val allDepsJar by registering(Jar::class) {
    dependsOn(java8DepsJarTask)
    from(java8DepsJarTask.outputs.getFiles().map(::zipTree))
    exclude("META-INF/*.kotlin_module")
    exclude("**/*.kotlin_metadata")
    archiveFileName.set("all-deps.jar")
  }

  val allTestsJarRelocated by registering(Exec::class) {
    dependsOn(r8WithRelocatedDepsTask)
    dependsOn(allTestsJar)
    val r8 = r8WithRelocatedDepsTask.outputs.getFiles().getSingleFile()
    val allTests = allTestsJar.get().outputs.files.getSingleFile()
    inputs.files(listOf(r8, allTests))
    val output = file(Paths.get("build", "libs", "all-tests-relocated.jar"))
    outputs.file(output)
    commandLine = baseCompilerCommandLine(
      r8,
      "relocator",
      listOf("--input",
             "$allTests",
             "--output",
             "$output",
             "--map",
             "kotlinx.metadata->com.android.tools.r8.jetbrains.kotlinx.metadata"))
  }

  withType<Test> {
    println("NOTE: Number of processors " + Runtime.getRuntime().availableProcessors())
    println("NOTE: Max parallel forks " + maxParallelForks)
    val os = DefaultNativePlatform.getCurrentOperatingSystem()
    if (os.isMacOsX) {
      logger.lifecycle(
        "WARNING: Testing in only partially supported on Mac OS. \n" +
          "Art only runs on Linux and tests requiring Art runs in a Docker container, which must " +
          "be present. See tools/docker/README.md for details.")
    } else if (os.isWindows) {
      logger.lifecycle(
        "WARNING: Testing in only partially supported on Windows. Art only runs on Linux and " +
          "tests requiring Art will be skipped")
    } else if (!os.isLinux) {
      logger.log(
        LogLevel.ERROR,
        "Testing in not supported on your platform. Testing is only fully supported on " +
          "Linux and partially supported on Mac OS and Windows. Art does not run on other " +
          "platforms.")
    }
    dependsOn(gradle.includedBuild("tests_java_8").task(":test"))
    dependsOn(gradle.includedBuild("tests_bootstrap").task(":test"))
  }
}