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

/**
 * This file was created using the `create_project.py` script located in the
 * `<AndroidX root>/development/project-creator` directory.
 *
 * Please use that script when creating a new project, rather than copying an existing project and
 * modifying its settings.
 */
import androidx.build.KmpPlatformsKt
import androidx.build.LibraryType
import androidx.build.PlatformIdentifier
import androidx.build.Publish
import androidx.build.RunApiTasks

plugins {
    id("AndroidXPlugin")
}

def macEnabled = KmpPlatformsKt.enableMac(project)
def linuxEnabled = KmpPlatformsKt.enableLinux(project)
def nativeEnabled = KmpPlatformsKt.enableNative(project)

androidXMultiplatform {
    jvm {}
    mac()
    linux()
    ios()
    androidNative()

    defaultPlatform(PlatformIdentifier.JVM)

    sourceSets {
        commonMain {
            dependencies {
                api(libs.kotlinStdlibCommon)
                api(libs.kotlinTestCommon)
            }
        }

        commonTest {
            dependencies {
                implementation(libs.kotlinTestAnnotationsCommon)
            }
        }

        jvmMain {
            dependsOn(commonMain)
            dependencies {
                api(libs.kotlinStdlib)
                api(libs.kotlinTest)
                implementation(libs.guavaAndroid)
            }
        }

        if (macEnabled || linuxEnabled || nativeEnabled) {
            nativeMain {
                dependsOn(commonMain)
            }

            nativeTest {
                dependsOn(commonTest)
            }
        }

        targets.all { target ->
            if (target.platformType == org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.native) {
                target.compilations["main"].defaultSourceSet {
                    dependsOn(nativeMain)
                }
                target.compilations["test"].defaultSourceSet {
                    dependsOn(nativeTest)
                }
            }
        }

        // Workaround for https://youtrack.jetbrains.com/issue/KT-51763
        // Make sure commonization runs before any compilation task.
        tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile).configureEach {
            it.dependsOn(tasks.named("commonize"))
        }
    }
}

androidx {
    legacyDisableKotlinStrictApiMode = true // Temporarily enabled to allow API tracking
    publish = Publish.SNAPSHOT_ONLY
    runApiTasks = new RunApiTasks.Yes() // Used to diff against Google Truth
    type = LibraryType.INTERNAL_TEST_LIBRARY
}
