/*
 * 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 {
    buildTypes.all {
        consumerProguardFiles 'proguard-rules.pro'
    }
}

configurations {
    repackage
}

dependencies {
    api(project(":room:room-common"))
    // ----------- Start of workaround to include room-common-java8 inside of aar as jar ----------
    repackage(project(":room:room-common-java8")) { transitive = false } // no dependencies
    implementation files(configurations.repackage) // files causes it to be bundled inside of aar
    // ----------- End of workaround to include room-common-java8 inside of aar as jar ------------
    api(ANDROIDX_SQLITE_FRAMEWORK)
    api(ANDROIDX_SQLITE)
    implementation(ARCH_CORE_RUNTIME)
    implementation(ANDROIDX_CORE)
    implementation(ANDROIDX_COLLECTION)
    compileOnly(ARCH_PAGING_COMMON)
    compileOnly(ARCH_LIFECYCLE_LIVEDATA_CORE)
    implementation(ANDROIDX_COLLECTION)

    testImplementation(ARCH_CORE_TESTING)
    testImplementation(JUNIT)
    testImplementation(MOCKITO_CORE)
    testImplementation(ARCH_LIFECYCLE_EXTENSIONS)
    testImplementation(KOTLIN_STDLIB)
    testImplementation(TRUTH)

    androidTestImplementation(JUNIT)
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ESPRESSO_CORE)
    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
}

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

    // Create jar<variant> task for testCompile 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")
    }

    // Make javaCompile task depend on room-common-java8 jar task.
    variant.javaCompileProvider.configure { task ->
        task.dependsOn(":room:room-common-java8:jar")
    }
}

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