/*
 * Copyright 2022 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.*

plugins {
    id("AndroidXPlugin")
    id("kotlin")
    id("java-gradle-plugin")
}

// This custom configuration ensures that dependencies used in tests with gradle test kit with
// generated build.gradle are considered when determining which tests to run on CI due to a change.
// For reference: b/281515796
configurations {
    neededForGradleTestKit {
        canBeResolved = true
    }
}

dependencies {
    compileOnly(libs.androidGradlePluginz)
    compileOnly(libs.kotlinGradlePluginz)

    implementation(gradleApi())
    implementation(libs.protobuf)
    implementation(libs.agpTestingPlatformCoreProto)

    testImplementation(gradleTestKit())
    testImplementation(project(":internal-testutils-gradle-plugin"))
    testImplementation(libs.junit)
    testImplementation(libs.kotlinTest)
    testImplementation(libs.truth)

    neededForGradleTestKit(libs.androidGradlePluginz)
    neededForGradleTestKit(libs.kotlinGradlePluginz)
    neededForGradleTestKit(libs.kotlinStdlib)
}

SdkResourceGenerator.generateForHostTest(project)

gradlePlugin {
    plugins {
        baselineProfileProducer {
            id = "androidx.baselineprofile.producer"
            implementationClass = "androidx.baselineprofile.gradle.producer.BaselineProfileProducerPlugin"
        }
        baselineProfileConsumer {
            id = "androidx.baselineprofile.consumer"
            implementationClass = "androidx.baselineprofile.gradle.consumer.BaselineProfileConsumerPlugin"
        }
        baselineProfileAppTarget {
            id = "androidx.baselineprofile.apptarget"
            implementationClass = "androidx.baselineprofile.gradle.apptarget.BaselineProfileAppTargetPlugin"
        }
        baselineProfileWrapper {
            id = "androidx.baselineprofile"
            implementationClass = "androidx.baselineprofile.gradle.wrapper.BaselineProfileWrapperPlugin"
        }
    }
}

androidx {
    name = "Baseline Profile Gradle Plugin"
    publish = Publish.SNAPSHOT_AND_RELEASE
    type = LibraryType.GRADLE_PLUGIN
    inceptionYear = "2022"
    description = "Android Baseline Profile Gradle Plugin"
}

tasks {
    validatePlugins {
        failOnWarning.set(true)
        enableStricterValidation.set(true)
    }
}

tasks.withType(Test).configureEach { test ->
    test.maxParallelForks(2)
}
afterEvaluate { tasks.named("test") { it.dependsOn(tasks.named("publish")) } }
