/*
 * 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.SoftwareType
import androidx.build.PlatformIdentifier
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType

plugins {
    id("AndroidXPlugin")
    id("AndroidXComposePlugin")
}

androidXMultiplatform {
    androidLibrary {
        compileSdk = 35
        namespace = "androidx.lifecycle.runtime.compose"
        optimization {
            it.consumerKeepRules.publish = true
            it.consumerKeepRules.files.add(new File("proguard-rules.pro"))
        }
    }
    desktop()
    mingwX64()
    linux()
    mac()
    ios()
    tvos()
    watchos()
    js()
    wasmJs()

    defaultPlatform(PlatformIdentifier.ANDROID)

    sourceSets {
        commonMain {
            dependencies {
                api(project(":lifecycle:lifecycle-runtime"))
                api("androidx.annotation:annotation:1.9.1")
                api("androidx.compose.runtime:runtime:1.9.0")
            }
        }

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

        androidMain {
            dependsOn(commonMain)
            dependencies {
                // Although this artifact is empty, it ensures that upgrading
                // `lifecycle-runtime-compose` also updates `lifecycle-runtime-ktx`
                // in cases where our constraints fail (e.g., internally in AndroidX
                // when using project dependencies).
                api(project(":lifecycle:lifecycle-runtime-ktx"))
            }
        }

        androidInstrumentedTest {
            dependencies {
                implementation(project(":lifecycle:lifecycle-runtime-testing"))
                implementation(project(":compose:ui:ui-test"))
                implementation(project(":compose:test-utils"))
                implementation(libs.testRules)
                implementation(libs.testRunner)
                implementation(libs.kotlinTest)
                implementation(project(":kruth:kruth"))
            }
        }

        nonAndroidMain {
            dependsOn(commonMain)
        }

        nonAndroidTest {
            dependsOn(commonTest)
        }

        desktopMain {
            dependsOn(nonAndroidMain)
        }

        desktopTest {
            dependsOn(nonAndroidTest)
        }

        nativeMain {
            dependsOn(nonAndroidMain)
        }

        nativeTest {
            dependsOn(nonAndroidTest)
        }

        webMain {
            dependsOn(nonAndroidMain)
        }

        webTest {
            dependsOn(nonAndroidTest)
        }

        targets.configureEach { target ->
            if (target.platformType == KotlinPlatformType.native) {
                target.compilations["main"].defaultSourceSet.dependsOn(nativeMain)
                target.compilations["test"].defaultSourceSet.dependsOn(nativeTest)
            } else if (target.platformType in [KotlinPlatformType.js, KotlinPlatformType.wasm]) {
                target.compilations["main"].defaultSourceSet.dependsOn(webMain)
                target.compilations["test"].defaultSourceSet.dependsOn(webTest)
            }
        }
    }
}

dependencies {
    lintPublish(project(":lifecycle:lifecycle-runtime-compose-lint"))
}

androidx {
    name = "Lifecycle Runtime Compose"
    type = SoftwareType.PUBLISHED_LIBRARY_ONLY_USED_BY_KOTLIN_CONSUMERS
    inceptionYear = "2021"
    description = "Compose integration with Lifecycle"
    samples(project(":lifecycle:lifecycle-runtime-compose:lifecycle-runtime-compose-samples"))
}
