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

import androidx.build.AndroidXUiPlugin
import androidx.build.LibraryGroups
import androidx.build.Publish
import androidx.build.RunApiTasks
import androidx.compose.material.icons.generator.tasks.IconGenerationTask

import static androidx.build.dependencies.DependenciesKt.*

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("AndroidXUiPlugin")
}

AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)

dependencies {
    kotlinPlugin project(":compose:compiler:compiler")

    if(!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
        /*
         * When updating dependencies, make sure to make the an an analogous update in the
         * corresponding block below
         */

        api project(":compose:material:material-icons-core")

        implementation(KOTLIN_STDLIB_COMMON)
        implementation project(":compose:runtime:runtime")

        androidTestImplementation(ANDROIDX_TEST_RULES)
        androidTestImplementation(ANDROIDX_TEST_RUNNER)
        androidTestImplementation(JUNIT)
        androidTestImplementation(KOTLIN_REFLECT)
        androidTestImplementation(TRUTH)

        androidTestImplementation project(":compose:foundation:foundation")
        androidTestImplementation project(":compose:foundation:foundation-layout")
        androidTestImplementation project(":compose:ui:ui")
        androidTestImplementation project(":test-screenshot")
        androidTestImplementation project(":compose:ui:ui-test-junit4")
        androidTestImplementation project(":activity:activity-compose")
    }
}

if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
    kotlin {
        android()
        jvm("desktop")
        /*
         * When updating dependencies, make sure to make the an an analogous update in the
         * corresponding block above
         */
        sourceSets {
            commonMain.dependencies {
                implementation(KOTLIN_STDLIB_COMMON)
                api project(":compose:material:material-icons-core")
                implementation project(":compose:runtime:runtime")
            }

            androidTest.dependencies {
                implementation project(":compose:foundation:foundation")
                implementation project(":compose:foundation:foundation-layout")
                implementation project(":compose:ui:ui")
                implementation project(":test-screenshot")
                implementation project(":compose:ui:ui-test-junit4")
                implementation project(":activity:activity-compose")

                implementation(ANDROIDX_TEST_RULES)
                implementation(ANDROIDX_TEST_RUNNER)
                implementation(JUNIT)
                implementation(KOTLIN_REFLECT)
                implementation(TRUTH)
            }
        }
    }
}

android.buildTypes.all {
    // Jacoco hangs intermittently due to the large number of files
    testCoverageEnabled = false
}

// b/175401659 - disable lint as it takes a long time, and most errors should be caught by lint on
// material-icons-core anyway
project.afterEvaluate {
    tasks.named("lintDebug") {
        enabled = false
    }
}

IconGenerationTask.registerExtendedIconProject(
        project,
        android,
        AndroidXUiPlugin.isMultiplatformEnabled(project)
)

androidx {
    name = "Compose Material Icons Extended"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenGroup = LibraryGroups.Compose.MATERIAL
    // This module has a large number (5000+) of generated source files and so doc generation /
    // API tracking will simply take too long
    runApiTasks = new RunApiTasks.No("Five thousand generated source files")
    inceptionYear = "2020"
    description = "Compose Material Design extended icons. This module contains all Material icons. It is a very large dependency and should not be included directly."
}
