// 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.util.concurrent.Callable
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  // Kotlin version is fixed by create_local_maven_dependencies.py
  id("org.jetbrains.kotlin.jvm")
  id("dependencies-plugin")
}

java {
  sourceSets.main.configure {
    kotlin.srcDir(getRoot().resolveAll("src", "resourceshrinker", "java"))
    java.srcDir(getRoot().resolveAll("src", "resourceshrinker", "java"))
  }
  sourceCompatibility = JvmCompatibility.sourceCompatibility
  targetCompatibility = JvmCompatibility.targetCompatibility
  toolchain { languageVersion = JavaLanguageVersion.of(JvmCompatibility.release) }
  withSourcesJar()
}

kotlin {
  explicitApi()
  compilerOptions {
    jvmTarget.set(JvmTarget.fromTarget(JvmCompatibility.release.toString()))
    languageVersion.set(KotlinVersion.KOTLIN_1_8)
    apiVersion.set(KotlinVersion.KOTLIN_1_8)
  }
}

fun jarDependencies(): FileCollection {
  return sourceSets.main
    .get()
    .compileClasspath
    .filter({
      "$it".contains("third_party") &&
        "$it".contains("dependencies") &&
        !"$it".contains("errorprone")
    })
}

val sharedDepsScope by configurations.dependencyScope("sharedDepsScope")
val sharedDepsConfig by
  configurations.resolvable("sharedDepsConfig") { extendsFrom(sharedDepsScope) }

dependencies {
  sharedDepsScope(project(":shared", "sharedDepsFiles"))
  compileOnly(Deps.asm)
  compileOnly(Deps.guava)
  compileOnly(Deps.protobuf)
  compileOnly(Deps.fastUtil)
  implementation("com.android.tools.build:aapt2-proto:9.1.0-alpha09-14792394")
  implementation("com.android.tools.layoutlib:layoutlib-api:31.5.0-alpha04")
  implementation("com.android.tools:common:31.5.0-alpha04")
  implementation("com.android.tools:sdk-common:31.5.0-alpha04")
}

tasks {
  withType<KotlinCompile> { dependsOn(sharedDepsConfig) }
  val depsJar by
    registering(Jar::class) {
      from(Callable { jarDependencies().map(::zipTree) })
      exclude("**/*.proto")
      exclude("versions-offline/**")
      duplicatesStrategy = DuplicatesStrategy.EXCLUDE
      archiveFileName.set("resourceshrinker_deps.jar")
    }
}

val resourceshrinkerJar by
  configurations.consumable("resourceshrinkerJar") { outgoing.artifact(tasks.named<Jar>("jar")) }

val resourceshrinkerDepsJar by
  configurations.consumable("resourceshrinkerDepsJar") {
    outgoing.artifact(tasks.named<Jar>("depsJar"))
  }

val resourceshrinkerSources by
  configurations.consumable("resourceshrinkerSources") {
    outgoing.artifact(tasks.named<Jar>("sourcesJar"))
  }

val resourceshrinkerClasses by
  configurations.consumable("resourceshrinkerClasses") {
    outgoing.artifact(tasks.named<JavaCompile>("compileJava").map { it.destinationDirectory })
    outgoing.artifact(tasks.named<KotlinCompile>("compileKotlin").map { it.destinationDirectory })
  }
