/*
 * 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 org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import androidx.build.LibraryGroups
import androidx.build.LibraryType
import androidx.build.Publish

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

// If set to `true`, we'll use KSP instead of KAPT.
// Note that the CI does not run tests with KSP yet so this is only for local usage.
// Once variants are properly supported by both ksp and AndroidX, we'll add support for this.
// (b/153917176)
def useKsp = project.properties.getOrDefault("useKsp", "false").toBoolean()
if (useKsp) {
    apply plugin: "com.google.devtools.ksp"
} else {
    apply plugin: "kotlin-kapt"
}

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    api(libs.kotlinStdlib)

    implementation(project(":room:room-runtime"))
    implementation(project(":room:room-ktx"))
    implementation(projectOrArtifact(":paging:paging-common"))

    androidTestImplementation(libs.kotlinCoroutinesTest)
    androidTestImplementation(libs.multidex)
    androidTestImplementation(libs.kotlinTestJunit)
    androidTestImplementation(libs.junit)
    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRunner)
    // depend on the shadowed version so that it tests with the shipped artifact
    // this is a temporary attribute until KSP and AndroidX plugin supports variants.
    // addendum -- shadowAndImplementation removed
    if (useKsp) {
        kspAndroidTest(
                project(path: ":room:room-compiler")
        )
    } else {
        kaptAndroidTest(
                project(path: ":room:room-compiler")
        )
    }
    androidTestImplementation(libs.truth)
    androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
    androidTestImplementation(project(":internal-testutils-common"))
}

// Allow usage of Kotlin's @OptIn.
tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
    }
}

androidx {
    name = "Room Paging"
    type = LibraryType.PUBLISHED_LIBRARY
    mavenGroup = LibraryGroups.ROOM
    inceptionYear = "2021"
    description = "Room Paging integration"
    publish = Publish.SNAPSHOT_AND_RELEASE
}
