/*
 * Copyright (C) 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 static androidx.build.SupportConfig.*

buildscript {
    dependencies {
        classpath('gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.13')
    }
}

plugins {
    id('com.android.library')
    id('com.google.protobuf')
}

android {
    buildToolsVersion BUILD_TOOLS_VERSION
    compileSdkVersion COMPILE_SDK_VERSION
    defaultConfig {
        minSdkVersion DEFAULT_MIN_SDK_VERSION
        targetSdkVersion TARGET_SDK_VERSION
        testInstrumentationRunner INSTRUMENTATION_RUNNER
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    sourceSets {
        main {
            java.srcDir 'java/src/'
            manifest.srcFile 'AndroidManifest.xml'
            proto.srcDir 'proto/'
        }
        // TODO(b/161205849): Re-enable this test once icing nativeLib is no longer being built
        //  inside appsearch:appsearch.
        //androidTest.java.srcDir 'java/tests/instrumentation/'
    }
}

dependencies {
    api('androidx.annotation:annotation:1.1.0')

    implementation('com.google.protobuf:protobuf-javalite:3.10.0')

    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.truth)
}

protobuf {
    protoc {
        artifact = libs.protobufCompiler.get()
    }

    generateProtoTasks {
        all().each { task ->
            project.tasks.named("extractReleaseAnnotations").configure {
                it.dependsOn(task)
            }
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
}

// 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("icing-${variantName}")

        // The proto-lite dependency includes .proto files, which are not used by icing. When apps
        // depend on appsearch as well as proto-lite directly, these files conflict since jarjar
        // only renames the java classes. Remove them here since they are unused.
        // Expand the jar and remove any .proto files.
        from(zipTree(configurations.detachedConfiguration(
                dependencies.create(libs.protobufLite.get())).getSingleFile())) {
            exclude("**/*.proto")
        }

        from files(variant.javaCompileProvider.get().destinationDir)
        dependsOn variant.javaCompileProvider.get()
    }

    def exportConfiguration = configurations.register("export${suffix}")
    artifacts.add(exportConfiguration.name, exportJarTask.flatMap { it.archiveFile })
}
