/*
 * 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.Publish
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

import static androidx.build.dependencies.DependenciesKt.*
import static androidx.inspection.gradle.InspectionPluginKt.packageInspector

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

AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)

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

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

        // TODO: b/160602714 create a lower level module to avoid this dependency on the
        // animation group
        api project(":compose:animation:animation-core")
        api project(":compose:runtime:runtime-saved-instance-state")
        api project(":compose:ui:ui-geometry")
        api project(":compose:ui:ui-graphics")
        api project(":compose:ui:ui-text")
        api project(":compose:ui:ui-unit")
        api "androidx.annotation:annotation:1.1.0"
        api "androidx.activity:activity:1.2.0-alpha02"

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

        implementation project(":compose:runtime:runtime")
        implementation project(":compose:ui:ui-util")
        implementation(KOTLIN_STDLIB)
        implementation "androidx.autofill:autofill:1.0.0"
        implementation(KOTLIN_COROUTINES_ANDROID)

        // we don't use these dependencies but we need to ensure at least these versions are
        // used if the user adds these dependencies as otherwise AppCompatActivity and Fragment
        // will not propagate ViewTree*Owners we are relying on and we will crash.
        // TODO: remove these dependencies at some point: b/161814404
        implementation "androidx.fragment:fragment:1.3.0-alpha07"
        implementation "androidx.appcompat:appcompat:1.3.0-alpha01"

        testImplementation(ANDROIDX_TEST_RULES)
        testImplementation(ANDROIDX_TEST_RUNNER)
        testImplementation(JUNIT)
        testImplementation(TRUTH)
        testImplementation(MOCKITO_CORE)
        testImplementation MOCKITO_KOTLIN, {
            exclude group: 'org.mockito' // to keep control on the mockito version
        }
        testImplementation(ROBOLECTRIC)
        testImplementation project(":compose:ui:ui-test-junit4")
        testImplementation project(":compose:test-utils")

        androidTestImplementation "androidx.fragment:fragment:1.2.4"
        androidTestImplementation "androidx.appcompat:appcompat:1.1.0"
        androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
        androidTestImplementation(ANDROIDX_TEST_RULES)
        androidTestImplementation(ANDROIDX_TEST_RUNNER)
        androidTestImplementation(ESPRESSO_CORE)
        androidTestImplementation(JUNIT)
        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
        // DexMaker has it"s own MockMaker
        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
        // DexMaker has it"s own MockMaker
        androidTestImplementation(TRUTH)
        androidTestImplementation MOCKITO_KOTLIN, {
            exclude group: 'org.mockito' // to keep control on the mockito version
        }
        androidTestImplementation project(":compose:foundation:foundation")
        androidTestImplementation project(":compose:foundation:foundation-layout")
        androidTestImplementation project(":compose:test-utils")
        androidTestImplementation project(":compose:ui:ui-test-font")
        androidTestImplementation project(":compose:ui:ui-test-junit4")
        androidTestImplementation project(":test-screenshot")
        androidTestImplementation "androidx.recyclerview:recyclerview:1.1.0"

        lintChecks project(":compose:ui:ui-lint")
        lintPublish project(":compose:ui:ui-lint")
    }
}

packageInspector(project, project(":compose:ui:ui-inspection"))

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

        /*
         * When updating dependencies, make sure to make the an an analogous update in the
         * corresponding block above
         */
        sourceSets {
            commonMain.dependencies {
                implementation(KOTLIN_STDLIB_COMMON)
                implementation(KOTLIN_COROUTINES_CORE)

                // TODO: b/160602714 create a lower level module to avoid this dependency on the
                // animation group
                api project(":compose:animation:animation-core")
                api project(":compose:runtime:runtime-saved-instance-state")
                api project(":compose:ui:ui-geometry")
                api project(":compose:ui:ui-graphics")
                api project(":compose:ui:ui-text")
                api project(":compose:ui:ui-unit")
                implementation project(":compose:runtime:runtime")
                implementation project(":compose:ui:ui-util")
            }

            androidMain.dependencies {
                implementation(KOTLIN_STDLIB)
                // This has stub APIs for access to legacy Android APIs, so we don't want
                // any dependency on this module.
                compileOnly project(":compose:ui:ui-android-stubs")
                api "androidx.annotation:annotation:1.1.0"
                api "androidx.activity:activity:1.2.0-alpha02"
                implementation "androidx.autofill:autofill:1.0.0"
                implementation(KOTLIN_COROUTINES_ANDROID)

                // we don't use these dependencies but we need to ensure at least these versions are
                // used if the user adds these dependencies as otherwise AppCompatActivity and Fragment
                // will not propagate ViewTree*Owners we are relying on and we will crash.
                // TODO: remove these dependencies at some point: b/161814404
                implementation "androidx.fragment:fragment:1.3.0-alpha07"
                implementation "androidx.appcompat:appcompat:1.3.0-alpha01"
            }

            jvmMain.dependencies {
                implementation(KOTLIN_STDLIB)
            }

            androidMain.dependsOn jvmMain
            desktopMain.dependsOn jvmMain

            test.dependencies {
                implementation(ANDROIDX_TEST_RULES)
                implementation(ANDROIDX_TEST_RUNNER)
                implementation(JUNIT)
                implementation(TRUTH)
                implementation(MOCKITO_CORE)
                implementation MOCKITO_KOTLIN, {
                    exclude group: 'org.mockito' // to keep control on the mockito version
                }
                implementation(ROBOLECTRIC)
                implementation project(":compose:ui:ui-test-junit4")
                implementation project(":compose:test-utils")
            }

            androidAndroidTest.dependencies {
                implementation "androidx.fragment:fragment:1.2.4"
                implementation "androidx.appcompat:appcompat:1.1.0"
                implementation(ANDROIDX_TEST_UIAUTOMATOR)
                implementation(ANDROIDX_TEST_RULES)
                implementation(ANDROIDX_TEST_RUNNER)
                implementation(ESPRESSO_CORE)
                implementation(JUNIT)
                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
                // DexMaker has it"s own MockMaker
                implementation(MOCKITO_CORE, libs.exclude_bytebuddy)
                // DexMaker has it"s own MockMaker
                implementation(TRUTH)
                implementation MOCKITO_KOTLIN, {
                    exclude group: 'org.mockito' // to keep control on the mockito version
                }
                implementation project(":compose:foundation:foundation")
                implementation project(":compose:foundation:foundation-layout")
                implementation project(":compose:test-utils")
                implementation project(":compose:ui:ui-test-font")
                implementation project(":compose:ui:ui-test-junit4")
                implementation project(":test-screenshot")
                implementation "androidx.recyclerview:recyclerview:1.1.0"
            }

            desktopTest.dependencies {
                implementation(TRUTH)
                implementation(JUNIT)
                implementation(MOCKITO_CORE)
                implementation MOCKITO_KOTLIN, {
                    exclude group: 'org.mockito' // to keep control on the mockito version
                }
                implementation(SKIKO_CURRENT_OS)
                implementation project(":compose:foundation:foundation")
                implementation project(":compose:ui:ui-test-junit4")
            }
        }
    }
}

androidx {
    name = "Compose UI primitives"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenGroup = LibraryGroups.Compose.UI
    inceptionYear = "2019"
    description = "Compose UI primitives. This library contains the primitives that form the Compose UI Toolkit, such as drawing, measurement and layout."
    legacyDisableKotlinStrictApiMode = true
}

if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
    tasks.findByName("desktopTest").configure {
        systemProperties['GOLDEN_PATH'] = project.rootDir.absolutePath + "/../../golden"
    }
}

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += [
            "-Xuse-experimental=kotlin.Experimental",
            "-XXLanguage:+InlineClasses"
        ]
    }
}

android {
    buildTypes {
        debug {
            testCoverageEnabled = false // Breaks Kotlin compiler.
        }
    }
    testOptions.unitTests.includeAndroidResources = true
    buildTypes.all {
        consumerProguardFiles("proguard-rules.pro")
    }
}

// Screenshot tests related setup
android {
    sourceSets.androidTest.assets.srcDirs +=
            project.rootDir.absolutePath + "/../../golden/compose/ui/ui"
}

if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
    // An ugly hack to workaround b/159426957
    // causing MPP+AGP to conflict.
    // See also: https://youtrack.jetbrains.com/issue/KT-34650
    // See also: https://youtrack.jetbrains.com/issue/KT-39712
    afterEvaluate {
        ["Api", "Implementation", "CompileOnly", "RuntimeOnly"].each { scope ->
            def erroneousExtendsFrom = [
                    "androidTest$scope",
                    "androidTestDebug$scope",
            ].collect { configurations[it] }
            [
                    "androidDebugUnitTest$scope",
                    "test$scope",
                    "testDebug$scope",
                    "testRelease$scope"
            ].each {
                def configuration = configurations[it]
                configuration.setExtendsFrom(configuration.extendsFrom - erroneousExtendsFrom)
            }
        }
    }
}
