/*
 * 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.*
import static androidx.build.dependencies.DependenciesKt.*

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(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RULES)
    androidTestImplementation(TRUTH)
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.10.0'
    }

    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(PROTOBUF_LITE)).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 })
}
