/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import androidx.build.LibraryGroups
import androidx.build.LibraryType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("AndroidXPlugin")
    id("kotlin")
}

dependencies {
    api(project(":room:room-compiler-processing"))
    implementation(libs.kotlinStdlib)
    implementation(libs.kspApi)
    implementation(libs.kotlinStdlibJdk8) // KSP defines older version as dependency, force update.
    implementation(libs.ksp)
    implementation(libs.googleCompileTesting)
    // specify these to match the kotlin compiler version in AndroidX rather than what KSP or KCT
    // uses
    implementation(libs.kotlinCompilerEmbeddable)
    implementation(libs.kotlinDaemonEmbeddable)
    implementation(libs.kotlinAnnotationProcessingEmbeddable)
}

/**
 * Create a properties file with versions that can be read from the test helper to setup test
 * projects.
 * see: b/178725084
 */
def testPropsOutDir = project.layout.buildDirectory.dir("test-config")
def writeTestPropsTask = tasks.register("prepareTestConfiguration", WriteProperties.class) {
    description = "Generates a properties file with the current environment for compilation tests"
    setOutputFile(testPropsOutDir.map {
        it.file("androidx.room.compiler.processing.util.CompilationTestCapabilities.Config" +
                ".properties")
    })
    property("kotlinVersion", libs.versions.kotlin.get())
    property("kspVersion", libs.versions.ksp.get())
}

java {
    sourceSets {
        main {
            resources.srcDir(testPropsOutDir)
        }
    }
}

tasks.named("sourceJar").configure {
    dependsOn(writeTestPropsTask)
}
tasks.named("processResources").configure {
    dependsOn(writeTestPropsTask)
}

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += [
                "-Xjvm-default=all",
        ]
    }
}

// enable opt in only for tests so that we don't create non experimental APIs by mistake
// in the source.
tasks.named("compileTestKotlin", KotlinCompile.class).configure {
    it.kotlinOptions {
        freeCompilerArgs += [
                "-Xopt-in=kotlin.RequiresOptIn",
                "-Xopt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"
        ]
    }
}

androidx {
    name = "AndroidX Room XProcessor Testing"
    type = LibraryType.ANNOTATION_PROCESSOR_UTILS
    mavenGroup = LibraryGroups.ROOM
    inceptionYear = "2020"
    description = "Testing helpers for Room XProcessing APIs"
}
