/*
 * 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.AndroidXUiPlugin
import androidx.build.LibraryGroups
import androidx.build.LibraryType

import static androidx.build.dependencies.DependenciesKt.*

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

AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)

dependencies {
    kotlinPlugin(project(":compose:compiler:compiler"))

    if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
        api(project(":compose:runtime:runtime"))
        api(project(":compose:ui:ui"))
        api(project(":compose:ui:ui-graphics"))
        api(project(":compose:ui:ui-text"))
        api(project(":compose:ui:ui-unit"))
        api(KOTLIN_COROUTINES_CORE)
        api(KOTLIN_COROUTINES_TEST)
        api(KOTLIN_STDLIB)
        api(KOTLIN_STDLIB_COMMON)

        implementation(project(":compose:ui:ui-util"))
        implementation("androidx.annotation:annotation:1.1.0")
        implementation(ESPRESSO_CORE)

        androidTestImplementation(project(":activity:activity-compose"))
        androidTestImplementation(project(":compose:material:material"))
        androidTestImplementation(project(":compose:test-utils"))
        androidTestImplementation(project(":compose:ui:ui-test-junit4"))
        androidTestImplementation(TRUTH)
        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
        androidTestImplementation(MOCKITO_KOTLIN, {
            exclude group: "org.mockito" // to keep control on the mockito version
        })
    }
}


if (AndroidXUiPlugin.isMultiplatformEnabled(project)) {
    kotlin {
        android()
        jvm("desktop")

        sourceSets {
            commonMain.dependencies {
                api(project(":compose:ui:ui"))
                api(project(":compose:ui:ui-text"))
                api(project(":compose:ui:ui-unit"))
                api(KOTLIN_STDLIB)

                implementation(project(":compose:ui:ui-util"))
            }

            jvmMain.dependencies {
                api(project(":compose:runtime:runtime"))
                api(KOTLIN_COROUTINES_CORE)
                api(KOTLIN_COROUTINES_TEST)
                api(KOTLIN_STDLIB_COMMON)
            }

            androidMain.dependencies {
                api(project(":compose:ui:ui-graphics"))

                implementation("androidx.annotation:annotation:1.1.0")
                implementation(ESPRESSO_CORE)
            }

            androidAndroidTest.dependencies {
                implementation(project(":compose:material:material"))
                implementation(project(":compose:test-utils"))
                implementation(project(":compose:ui:ui-test-junit4"))
                implementation(project(":activity:activity-compose"))
                implementation(TRUTH)
                implementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
                implementation(MOCKITO_KOTLIN, {
                    exclude group: "org.mockito" // to keep control on the mockito version
                })
            }

            desktopMain.dependencies {
                implementation(JUNIT)
                implementation(TRUTH)
                implementation(SKIKO)
            }

            androidMain.dependsOn(jvmMain)
            desktopMain.dependsOn(jvmMain)
            jvmMain.dependsOn(commonMain)
        }
    }
}

androidx {
    name = "Compose Testing"
    type = LibraryType.PUBLISHED_LIBRARY
    mavenGroup = LibraryGroups.Compose.UI
    inceptionYear = "2019"
    description = "Compose testing library"
    legacyDisableKotlinStrictApiMode = true
}
