// This file applies dependencies common to projects in buildSrc

apply from: "${buildscript.sourceFile.parent}/kotlin-dsl-dependency.gradle"
// copy findGradleKotlinDsl to a local variable: https://github.com/gradle/gradle/issues/26057
def findGradleKotlinDsl = project.findGradleKotlinDsl
dependencies {

    // Gradle APIs
    implementation(gradleApi())
    compileOnly(findGradleKotlinDsl())

    // Android Gradle Plugin APIs used by Stable AIDL
    implementation(libs.androidGradlePluginApi)

    // Plugins we use and configure
    implementation(libs.androidGradlePluginz)
    implementation(libs.androidToolsCommon) // for com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
    implementation(libs.androidToolsRepository) // com.android.repository for Stable AIDL plugin
    implementation(libs.androidToolsSdkCommon) // com.android.ide.common for Stable AIDL plugin
    implementation(libs.kotlinGradlePluginz)
    implementation(libs.spdxGradlePluginz)
    implementation(libs.androidKotlinMultiplatform)
    implementation(libs.kotlinCompilerEmbeddable) // for clang compiler

    // For Room Gradle Plugin
    implementation(libs.kspGradlePluginz)

    // Force jsoup upgrade on spdx (b/309773103)
    implementation(libs.jsoup)

    // json parser
    implementation(libs.gson)

    // XML parsers used in MavenUploadHelper.kt
    implementation(libs.dom4j) {
        // Optional dependency where Ivy fails to parse the POM file.
        exclude(group:"net.java.dev.msv", module:"xsdlib")
    }
    implementation(libs.xerces)

    implementation(libs.ktfmt)
    implementation(libs.kotlinCoroutinesCore)
    implementation(libs.shadow) // used by BundleInsideHelper.kt
    implementation(libs.apacheAnt) // used in AarManifestTransformerTask.kt for unziping
    implementation(libs.toml)
    implementation(libs.apacheCommonIo) // used in CheckApiEquivalenceTask.kt
    implementation(libs.dexMemberList) // used in ReportLibraryMetricsTask.kt

    implementation(libs.protobufGradlePlugin) // needed to compile inspection plugin
    implementation(libs.kotlinPoet) // needed to compile material-icon-generator
    implementation(libs.xmlpull) // needed to compile material-icon-generator

    implementation(libs.protobuf) // needed to compile baseline-profile gradle plugins
    implementation(libs.agpTestingPlatformCoreProto) // needed to compile baseline-profile gradle plugins

    // dependencies that aren't used by buildSrc directly but that we resolve here so that the
    // root project doesn't need to re-resolve them and their dependencies on every build
    runtimeOnly(libs.hiltAndroidGradlePluginz)
    runtimeOnly(libs.javapoet) // for hiltAndroidGradlePluginz to workaround https://github.com/google/dagger/issues/3068
    runtimeOnly(libs.wireGradlePluginz)
}
