import com.vanniktech.maven.publish.SonatypeHost
import net.ltgt.gradle.errorprone.CheckSeverity

plugins {
  id 'com.android.library'
  id 'net.ltgt.errorprone'
  id 'com.vanniktech.maven.publish'
  id 'androidx.baselineprofile'
}

android {
  namespace 'com.airbnb.lottie'
  resourcePrefix 'lottie_'
  compileSdk 34
  defaultConfig {
    minSdk 16
    targetSdk 34
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }
  lintOptions {
    abortOnError true
    textReport true
    textOutput 'stdout'
  }
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

mavenPublishing {
  publishToMavenCentral(SonatypeHost.DEFAULT)
  signAllPublications()
}

baselineProfile {
  filter {
    include 'com.airbnb.lottie.**'
    exclude 'com.airbnb.lottie.compose.**'
  }
}

dependencies {
  implementation libs.androidx.appcompat
  // Do not upgrade to 2.0 because it will bring in Kotlin as a transitive dependency.
  //noinspection GradleDependency
  implementation libs.okio

  annotationProcessor libs.nullaway
  errorprone libs.errorprone.core

  baselineProfile project(':baselineprofile')

  testImplementation libs.mockito.core
  testImplementation libs.robolectric
  testImplementation libs.junit4
  androidTestImplementation libs.androidx.test.junit
  androidTestImplementation libs.androidx.test.espresso
}

tasks.withType(JavaCompile).configureEach {
  // remove the if condition if you want to run NullAway on test code
  if (!name.toLowerCase().contains("test")) {
    options.errorprone {
      option("NullAway:AnnotatedPackages", "com.airbnb.lottie")
      // TODO: enable these and fix errors one by one.
      check("NullAway", CheckSeverity.OFF)
      check("StringSplitter", CheckSeverity.OFF)
      check("DefaultCharset", CheckSeverity.OFF)
      check("HidingField", CheckSeverity.OFF)
      check("NarrowingCompoundAssignment", CheckSeverity.OFF)
      check("MissingOverride", CheckSeverity.OFF)
      check("ReferenceEquality", CheckSeverity.OFF)
      check("FallThrough", CheckSeverity.OFF)
      check("FloatingPointLiteralPrecision", CheckSeverity.OFF)
      check("MissingCasesInEnumSwitch", CheckSeverity.OFF)
      check("OperatorPrecedence", CheckSeverity.OFF)
      // Disabled checks
      check("MixedMutabilityReturnType", CheckSeverity.OFF)
      check("MissingSummary", CheckSeverity.OFF)
      check("InlineMeSuggester", CheckSeverity.OFF)
    }
  }
}
