/*
 * 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)
    testImplementation(ANDROIDX_TEST_RUNNER) // Needed for @FlakyTest and @Ignore

    androidTestImplementation(JUNIT)
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ESPRESSO_CORE)
    androidTestImplementation(KOTLIN_STDLIB)
    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(DEXMAKER_MOCKITO, excludes.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)
        destinationDirectory.fileValue(new File(project.buildDir, "libJar"))
    }
}

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