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

import static androidx.build.dependencies.DependenciesKt.*

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

apply from: "dependencies.gradle"

dependencies {
    // NOTE: API and IMPLEMENTATION dependencies are defined in dependencies.gradle to export for
    // other modules depending on the jarjar variant of CameraPipe. All dependencies should be
    // added there rather than directly here.
    api CAMERA_PIPE_DEPS.API
    implementation CAMERA_PIPE_DEPS.IMPLEMENTATION

    kapt(DAGGER_COMPILER)

    testImplementation(ANDROIDX_TEST_CORE)
    testImplementation(ANDROIDX_TEST_RUNNER)
    testImplementation(JUNIT)
    testImplementation(TRUTH)
    testImplementation(ROBOLECTRIC)
    testImplementation(KOTLIN_COROUTINES_TEST)
    testImplementation(project(":camera:camera-camera2-pipe-testing"))

    kaptTest(DAGGER_COMPILER)

    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(TRUTH)
}

android {
    defaultConfig {
        minSdkVersion 21
    }

    // Use Robolectric 4.+
    testOptions.unitTests.includeAndroidResources = true
}

kapt {
    javacOptions {
        option("-Adagger.fastInit=enabled")
        option("-Adagger.fullBindingGraphValidation=ERROR")
    }
}

// Create export artifact for all variants (debug/release) for JarJaring
android.libraryVariants.all { variant ->
    def variantName = variant.name
    def suffix = variantName.capitalize()
    def exportJarTask = tasks.register("exportJar${suffix}", Jar) {
        archiveBaseName.set("camera-camera2-pipe-${variantName}-export")
        def kotlinCompileTask = tasks.findByName("compile${suffix}Kotlin")
        from kotlinCompileTask.outputs.files
        from files(variant.javaCompileProvider.get().destinationDir)
        dependsOn kotlinCompileTask
        dependsOn variant.javaCompileProvider.get()
    }
    def exportConfiguration = configurations.register("export${suffix}")
    artifacts.add(exportConfiguration.name, exportJarTask.flatMap{ it.archiveFile })
}

androidx {
    name = "Jetpack Camera Pipe"
    publish = Publish.SNAPSHOT_ONLY
    mavenGroup = LibraryGroups.CAMERA
    mavenVersion = LibraryVersions.CAMERA_PIPE
    inceptionYear = "2020"
    description = "A set of opinionated camera interfaces and implementations on top of Camera2 " +
            "that will form a flexible shim layer to power Frameserver and CameraX."
}

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