/*
 * Copyright (C) 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
import org.jetbrains.kotlin.konan.target.Family

plugins {
    id("AndroidXPlugin")
}

androidXMultiplatform {
    jvm()
    mac()
    linux()
    ios()
    watchos()
    tvos()
    js()
    wasmJs()
    mingwX64()
    androidLibrary {
        namespace = "androidx.paging.testing"
    }

    defaultPlatform(PlatformIdentifier.ANDROID)

    sourceSets {
        commonMain {
            dependencies {
                api(libs.kotlinStdlib)
                implementation(project(":paging:paging-common"))
            }
        }

        commonJvmMain {
            dependsOn(commonMain)
        }

        jvmMain {
            dependsOn(commonJvmMain)
        }

        androidMain {
            dependsOn(commonJvmMain)
        }

        nonJvmMain {
            dependsOn(commonMain)
            dependencies {
                implementation(libs.atomicFu)
            }
        }

        webMain {
            dependsOn(nonJvmMain)
        }

        commonTest {
            dependencies {
                implementation(libs.kotlinTest)
                implementation(libs.kotlinCoroutinesTest)
                implementation(project(":internal-testutils-paging"))
                implementation(project(":kruth:kruth"))
            }
        }

        commonJvmTest {
            dependsOn(commonTest)
            dependencies {
                implementation(libs.junit)
            }
        }

        jvmTest {
            dependsOn(commonJvmTest)
        }

        androidInstrumentedTest {
            dependsOn(commonJvmTest)
            dependencies {
                implementation(libs.testRunner)
            }
        }

        webTest {
            dependsOn(commonTest)
        }

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

androidx {
    name = "Paging Testing Extensions"
    type = SoftwareType.PUBLISHED_TEST_LIBRARY
    inceptionYear = "2022"
    description = "Test artifact for Paging implementation"
}

