/*
 * 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.
 */

/**
 * This file was created using the `create_project.py` script located in the
 * `<AndroidX root>/development/project-creator` directory.
 *
 * Please use that script when creating a new project, rather than copying an existing project and
 * modifying its settings.
 */
import androidx.build.SoftwareType

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
}

dependencies {
    implementation("androidx.core:core:1.3.2")

    // Classes and types that are needed at compile & runtime
    api("androidx.annotation:annotation:1.8.1")
    api(project(":camera:camera-core"))
    api(libs.guavaListenableFuture)
    api(libs.kotlinCoroutinesCore)
    api("androidx.lifecycle:lifecycle-livedata-core:2.1.0")

    // Classes and types that are only needed at runtime
    implementation(libs.atomicFu)
    implementation(libs.dagger)
    implementation(libs.kotlinStdlib)
    implementation(libs.kotlinCoroutinesAndroid)
    implementation(project(":camera:camera-camera2-pipe"))
    implementation(project(":concurrent:concurrent-futures-ktx"))
    implementation("androidx.annotation:annotation-experimental:1.4.1")
    implementation("androidx.arch.core:core-common:2.1.0")
    implementation(libs.jspecify)

    ksp(libs.daggerCompiler)

    testImplementation(libs.testCore)
    testImplementation(libs.testRunner)
    testImplementation(libs.junit)
    testImplementation(libs.truth)
    testImplementation(libs.mockitoCore4)
    testImplementation(libs.mockitoKotlin4)
    testImplementation(libs.byteBuddy)
    testImplementation(libs.kotlinCoroutinesTest)
    testImplementation(libs.kotlinTestJunit)
    testImplementation(project(":camera:camera-camera2-pipe-testing"))
    testImplementation(project(":camera:camera-testing"))
    testImplementation(project(":internal-testutils-ktx"))
    testImplementation(project(":internal-testutils-truth"))
    testImplementation("androidx.exifinterface:exifinterface:1.0.0")
    testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
    testImplementation("androidx.arch.core:core-runtime:2.1.0")
    testImplementation("androidx.lifecycle:lifecycle-common:2.3.1")
    testImplementation(libs.guavaAndroid)
    testImplementation(libs.kotlinTest)
    testImplementation(libs.testMonitor)

    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.kotlinCoroutinesAndroid)
    androidTestImplementation(libs.kotlinStdlib)
    androidTestImplementation(libs.truth)
    androidTestImplementation(project(":camera:camera-lifecycle"))
    androidTestImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
    }
    androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
    androidTestImplementation(project(":internal-testutils-truth"))
    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
    androidTestImplementation(libs.guavaAndroid)
    androidTestImplementation(libs.hamcrestCore)
    androidTestImplementation(libs.junit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testMonitor)
}

android {
    compileSdk = 35

    lint {
        enable.add("CameraXQuirksClassDetector")
    }
    namespace = "androidx.camera.camera2.pipe.integration"
}

tasks.withType(Test).configureEach { test ->
    test.maxParallelForks = 2
}

ksp {
    arg("dagger.fastInit", "enabled")
    arg("dagger.fullBindingGraphValidation", "ERROR")
}

androidx {
    name = "Camera2 Pipe Integration"
    type = SoftwareType.PUBLISHED_LIBRARY
    inceptionYear = "2020"
    description = "A Camera2 Pipe implementation of CameraX, a library providing a consistent " +
            "and reliable camera foundation that enables great camera driven experiences across " +
            "all of Android."
    doNotDocumentReason = "Not shipped externally"
    enableRobolectric()
}
