/*
 * Copyright 2021 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.AndroidXComposePlugin
import androidx.build.BundleInsideHelper
import androidx.build.LibraryType
import androidx.glance.appwidget.layoutgenerator.gradle.LayoutGeneratorTask

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("AndroidXComposePlugin")
    id("com.google.protobuf")
}

BundleInsideHelper.forInsideAar(
        project,
        /* from = */ "com.google.protobuf",
        /* to =   */ "androidx.glance.appwidget.protobuf"
)

// Disable multi-platform; this will only be used on Android.
AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */ false)

dependencies {
    bundleInside(project(
            path: ":glance:glance-appwidget-proto",
            configuration: "export"
    ))

    api(project(":glance:glance"))
    api("androidx.annotation:annotation:1.1.0")
    api("androidx.compose.runtime:runtime:1.1.0-beta01")
    api("androidx.compose.ui:ui-graphics:1.1.0-beta01")
    api("androidx.compose.ui:ui-unit:1.1.0-beta01")

    implementation('androidx.core:core-ktx:1.7.0')
    implementation("androidx.datastore:datastore:1.0.0")
    implementation("androidx.datastore:datastore-core:1.0.0")
    implementation("androidx.datastore:datastore-preferences-core:1.0.0")
    implementation("androidx.datastore:datastore-preferences:1.0.0")
    implementation("com.google.android.material:material:1.6.0")
    implementation(project(':core:core-remoteviews'))
    implementation(libs.kotlinStdlib)

    testImplementation(libs.junit)
    testImplementation(libs.kotlinCoroutinesTest)
    testImplementation(libs.kotlinTest)
    testImplementation(libs.mockitoCore)
    testImplementation(libs.mockitoKotlin)
    testImplementation(libs.robolectric)
    testImplementation(libs.testCore)
    testImplementation(libs.testRules)
    testImplementation(libs.testRunner)
    testImplementation(libs.truth)
    testImplementation(libs.kotlinReflect)
    testImplementation('androidx.core:core-ktx:1.7.0')
    testImplementation("androidx.datastore:datastore-core:1.0.0")
    testImplementation("androidx.datastore:datastore-preferences-core:1.0.0")
    testImplementation("androidx.datastore:datastore-preferences:1.0.0")

    androidTestImplementation(project(":test:screenshot:screenshot"))
    androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
    androidTestImplementation('androidx.core:core-ktx:1.7.0')
    androidTestImplementation(libs.espressoCore)
    androidTestImplementation(libs.espressoIdlingResource)
    androidTestImplementation(libs.kotlinCoroutinesTest)
    androidTestImplementation(libs.kotlinTest)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testExtJunitKtx)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.truth)
    androidTestImplementation(libs.kotlinReflect)
}

android {
    // Use Robolectric 4.+
    testOptions.unitTests.includeAndroidResources = true
    resourcePrefix "glance_"

    sourceSets {
        androidTest.assets.srcDirs += project.rootDir.absolutePath + "/../../golden/glance/glance-appwidget"
    }

    buildTypes {
        debug {
            pseudoLocalesEnabled true
        }
    }
    namespace "androidx.glance.appwidget"

    buildTypes.all {
        consumerProguardFiles "proguard-rules.pro"
    }
}

androidx {
    name = "Glance For App Widgets"
    type = LibraryType.PUBLISHED_LIBRARY
    mavenGroup = LibraryGroups.GLANCE
    inceptionYear = "2021"
    description = "Glance-appwidgets allows developers to build layouts for Android AppWidgets " +
            "using a Jetpack Compose-style API."
    targetsJavaConsumers = false
}

LayoutGeneratorTask.registerLayoutGenerator(
        project,
        android,
        /* containerLayoutDirectory= */ file("src/androidMain/layoutTemplates"),
        /* childLayoutDirectory= */ file("src/androidMain/res/layout")
)
