/*
 * Copyright (C) 2023 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.LibraryType
import androidx.build.PlatformIdentifier

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

androidXMultiplatform {
    android()
    desktop()

    defaultPlatform(PlatformIdentifier.ANDROID)

    sourceSets {
        commonMain {
            dependencies {
                implementation(libs.kotlinStdlibCommon)
                api(project(":compose:material3:material3"))
                api(project(":compose:material3:adaptive:adaptive"))
                implementation("androidx.compose.ui:ui-util:1.6.0")
                implementation("androidx.window:window-core:1.3.0-beta02")
            }
        }

        commonTest {
            dependencies {
            }
        }

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

        androidMain {
            dependsOn(jvmMain)
            dependencies {
                api("androidx.annotation:annotation:1.1.0")
                api("androidx.annotation:annotation-experimental:1.4.0")
            }
        }

        desktopMain {
            dependsOn(jvmMain)
            dependencies {
            }
        }

        jvmTest {
            dependencies {
            }
        }

        desktopTest {
            dependsOn(jvmTest)
        }

        androidInstrumentedTest {
            dependsOn(jvmTest)
            dependencies {
                implementation(project(":compose:test-utils"))
                implementation(project(":window:window-testing"))
                implementation(libs.junit)
                implementation(libs.testRunner)
                implementation(libs.truth)
            }
        }

        androidUnitTest {
            dependsOn(jvmTest)
            dependencies {
                implementation(libs.junit)
                implementation(libs.testRunner)
                implementation(libs.truth)
            }
        }
    }
}

android {
    namespace "androidx.compose.material3.adaptive.navigationsuite"
}

androidx {
    name = "Material Adaptive Navigation Suite"
    type = LibraryType.PUBLISHED_LIBRARY_ONLY_USED_BY_KOTLIN_CONSUMERS
    inceptionYear = "2023"
    description = "Compose Material Design Adaptive Navigation Suite Library"
    samples(project(":compose:material3:material3-adaptive-navigation-suite:material3-adaptive-navigation-suite-samples"))
}
