/*
 * Copyright (C) 2021 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 androidx.build.KotlinTarget
import androidx.build.PlatformIdentifier
import androidx.build.SoftwareType
import com.android.build.gradle.internal.lint.AndroidLintAnalysisTask
import com.android.build.gradle.internal.lint.LintModelWriterTask
import com.google.devtools.ksp.gradle.KspAATask
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType

plugins {
    id("AndroidXPlugin")
    id("com.google.devtools.ksp")
}

androidXMultiplatform {
    androidLibrary {
        namespace = "androidx.room.paging"
    }
    jvm()
    mac()
    linux()
    ios()
    // TODO(b/432783733): Add TV and Watch once paging-common 3.4 is released
    // tvos()
    // watchos()

    defaultPlatform(PlatformIdentifier.ANDROID)

    sourceSets {
        commonMain {
            dependencies {
                api(libs.kotlinStdlib)
                api("androidx.paging:paging-common:3.3.2")
                api(project(":room:room-runtime"))
            }
        }

        commonTest {
            dependencies {
                implementation(libs.kotlinCoroutinesTest)
                implementation(project(":kruth:kruth"))
            }
        }

        androidMain {
            dependsOn(commonMain)
        }

        jvmNativeMain {
            dependsOn(commonMain)
        }

        jvmMain {
            dependsOn(jvmNativeMain)
        }

        nativeMain {
            dependsOn(jvmNativeMain)
            dependencies {
                implementation(libs.atomicFu)
            }
        }

        androidInstrumentedTest {
            dependsOn(commonTest)
            dependencies {
                implementation(libs.junit)
                implementation(project(":internal-testutils-common"))
                implementation(libs.kotlinTestJunit)
                implementation(libs.testExtJunit)
                implementation(libs.testCore)
                implementation(libs.testRunner)
                implementation("androidx.arch.core:core-testing:2.2.0")
                implementation("androidx.paging:paging-testing:3.3.2")
            }
        }
        targets.configureEach { target ->
            if (target.platformType == KotlinPlatformType.native) {
                target.compilations["main"].defaultSourceSet {
                    dependsOn(nativeMain)
                }
            }
        }
    }
}

dependencies {
    add("kspAndroidInstrumentedTest", project(":room:room-compiler"))
}

androidx {
    name = "Room Paging"
    type = SoftwareType.PUBLISHED_LIBRARY
    inceptionYear = "2021"
    description = "Room Paging integration"
    kotlinTarget = KotlinTarget.KOTLIN_2_1
}

// TODO(https://github.com/google/ksp/issues/2250) Remove when KSP migrates to the new variants API
// Without this, dependency introduced between lintAnalyzeAndroidInstrumentedTest and kspAndroidInstrumentedTest
tasks.withType(AndroidLintAnalysisTask).configureEach {
    mustRunAfter(tasks.withType(KspAATask))
}

// TODO(https://github.com/google/ksp/issues/2250) Remove when KSP migrates to the new variants API
// Without this, dependency introduced between lintAnalyzeAndroidInstrumentedTest and kspAndroidInstrumentedTest
tasks.withType(LintModelWriterTask).configureEach {
    mustRunAfter(tasks.withType(KspAATask))
}
