/*
 * 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 ->
            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 })
}
