/*
 * Copyright (C) 2016 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 static androidx.build.dependencies.DependenciesKt.*
import androidx.build.LibraryGroups
import androidx.build.LibraryVersions
import androidx.build.AndroidXExtension
import androidx.build.Publish

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

android {
    buildFeatures {
        aidl = true
    }
    buildTypes.all {
        consumerProguardFiles "proguard-rules.pro"
    }
}

dependencies {
    api(project(":room:room-common"))
    api("androidx.sqlite:sqlite-framework:2.1.0")
    api("androidx.sqlite:sqlite:2.1.0")
    implementation("androidx.arch.core:core-runtime:2.0.1")
    compileOnly("androidx.paging:paging-common:2.0.0")
    compileOnly("androidx.lifecycle:lifecycle-livedata-core:2.0.0")
    implementation("androidx.annotation:annotation-experimental:1.1.0-rc01")
    compileOnly KOTLIN_STDLIB // Due to :annotation-experimental

    testImplementation("androidx.arch.core:core-testing:2.0.1")
    testImplementation(JUNIT)
    testImplementation(MOCKITO_CORE)
    testImplementation("androidx.lifecycle:lifecycle-livedata-core:2.0.0")
    testImplementation(KOTLIN_STDLIB)
    testImplementation(TRUTH)

    androidTestImplementation(JUNIT)
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ESPRESSO_CORE)
    androidTestImplementation(KOTLIN_STDLIB)
    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(project(":internal-testutils-truth")) // for assertThrows
    androidTestImplementation("androidx.arch.core:core-testing:2.0.1")

}

android.libraryVariants.all { variant ->
    def name = variant.name
    def suffix = name.capitalize()

    // Create jar<variant> task for testImplementation in room-compiler.
    project.tasks.create(name: "jar${suffix}", type: Jar){
        dependsOn(variant.javaCompileProvider.get())
        from(variant.javaCompileProvider.get().destinationDir)
        destinationDir(new File(project.buildDir, "libJar"))
    }
}

androidx {
    name = "Android Room-Runtime"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenGroup = LibraryGroups.ROOM
    inceptionYear = "2017"
    description = "Android Room-Runtime"
}
