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

import static androidx.build.dependencies.DependenciesKt.*
import androidx.build.LibraryGroups
import androidx.build.LibraryVersions
import androidx.build.Publish

plugins {
    id("AndroidXPlugin")
    id("AndroidXUiPlugin")
    id("com.android.library")
    id("kotlin-multiplatform")
}
dependencies {
    kotlinPlugin project(path: ":compose:compose-compiler")
}
kotlin {
    android()

    sourceSets {
        commonMain.dependencies {
            implementation(KOTLIN_STDLIB)
        }
        commonTest.dependencies {
            implementation kotlin("test-junit")
            implementation project(":ui:ui-framework")
        }

        jvmMain {
        }
        // TODO(aelias): Consider using commonTest for unit tests if a usable feature
        // is added for https://youtrack.jetbrains.com/issue/KT-34662
        unitTest {
        }
        androidMain {
            dependsOn jvmMain
        }
        androidMain.dependencies {
            api "androidx.annotation:annotation:1.0.0"
            implementation "org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3"
        }

        // TODO(aelias): Change to androidLocalTest and androidDeviceTest when
        // https://github.com/JetBrains/kotlin/pull/2829 rolls in
        androidTest {
            dependsOn unitTest
        }
        androidAndroidTest.dependencies {
            implementation(ANDROIDX_TEST_EXT_JUNIT)
            implementation(ANDROIDX_TEST_RULES)
            implementation project(":ui:ui-framework")
            implementation project(":ui:ui-platform")
        }
        all {
            languageSettings.useExperimentalAnnotation("kotlin.Experimental")
        }
    }
}

android {
    buildTypes {
        debug {
            testCoverageEnabled = false
        }
        release {
            testCoverageEnabled = false
        }
    }

    // b/148416113: AGP doesn't know about Kotlin-MPP's sourcesets yet, so add
    // them to its source directories (this fixes lint, and code completion in
    // Android Studio on versions >= 4.0canary8)
    sourceSets.main.java.srcDirs = ['src/commonMain/kotlin','src/jvmMain/kotlin','src/androidMain/kotlin']
    sourceSets.test.java.srcDirs = ['src/unitTest/kotlin']
    sourceSets.androidTest.java.srcDirs = ['src/androidAndroidTest/kotlin']
}

androidx {
    name = "AndroidX Compose"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenVersion = LibraryVersions.COMPOSE
    mavenGroup = LibraryGroups.COMPOSE
    inceptionYear = "2019"
    description = "Contains support code for tree composition"
}

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        useIR = true
    }
}
