/*
 * Copyright 2019 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.AndroidXComposePlugin
import androidx.build.LibraryType
import androidx.build.Publish
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("AndroidXComposePlugin")
}

AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project)

dependencies {

    if(!AndroidXComposePlugin.isMultiplatformEnabled(project)) {
        /*
         * When updating dependencies, make sure to make the an an analogous update in the
         * corresponding block below
         */

        api("androidx.activity:activity:1.2.0")
        api(projectOrArtifact(":compose:ui:ui-test-junit4"))
        api(project(":test:screenshot:screenshot"))

        implementation(libs.kotlinStdlibCommon)
        implementation(projectOrArtifact(":compose:runtime:runtime"))
        implementation(projectOrArtifact(":compose:ui:ui-unit"))
        implementation(projectOrArtifact(":compose:ui:ui-graphics"))
        implementation(projectOrArtifact(":activity:activity-compose"))
        // old version of common-java8 conflicts with newer version, because both have
        // DefaultLifecycleEventObserver.
        // Outside of androidx this is resolved via constraint added to lifecycle-common,
        // but it doesn't work in androidx.
        // See aosp/1804059
        implementation(projectOrArtifact(":lifecycle:lifecycle-common-java8"))
        implementation(libs.testCore)
        implementation(libs.testRules)

        // This has stub APIs for access to legacy Android APIs, so we don't want
        // any dependency on this module.
        compileOnly(projectOrArtifact(":compose:ui:ui-android-stubs"))

        testImplementation(libs.truth)

        androidTestImplementation(libs.truth)
        androidTestImplementation(projectOrArtifact(":compose:material:material"))
    }
}

if (AndroidXComposePlugin.isMultiplatformEnabled(project)) {
    androidXComposeMultiplatform {
        android()
    }

    kotlin {
        /*
         * When updating dependencies, make sure to make the an an analogous update in the
         * corresponding block above
         */
        sourceSets {
            commonMain.dependencies {
                implementation(libs.kotlinStdlibCommon)
                implementation(projectOrArtifact(":compose:runtime:runtime"))
                implementation(projectOrArtifact(":compose:ui:ui-unit"))
                implementation(projectOrArtifact(":compose:ui:ui-graphics"))
                implementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
            }

            androidMain.dependencies {
                api("androidx.activity:activity:1.2.0")
                implementation "androidx.activity:activity-compose:1.3.1"
                api(projectOrArtifact(":compose:ui:ui-test-junit4"))
                api(project(":test:screenshot:screenshot"))
                // This has stub APIs for access to legacy Android APIs, so we don't want
                // any dependency on this module.
                compileOnly(projectOrArtifact(":compose:ui:ui-android-stubs"))
                implementation(libs.testCore)
                implementation(libs.testRules)
            }

            // TODO(b/214407011): These dependencies leak into instrumented tests as well. If you
            //  need to add Robolectric (which must be kept out of androidAndroidTest), use a top
            //  level dependencies block instead:
            //  `dependencies { testImplementation(libs.robolectric) }`
            androidTest.dependencies {
                implementation(libs.truth)
            }

            androidAndroidTest.dependencies {
                implementation(libs.truth)
                implementation(projectOrArtifact(":compose:material:material"))
            }
        }
    }
}

androidx {
    name = "Compose Internal Test Utils"
    type = LibraryType.INTERNAL_TEST_LIBRARY
    publish = Publish.NONE
    inceptionYear = "2020"
    description = "Compose internal test utils."
}

android {
    namespace "androidx.compose.testutils"
}

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