buildscript {
  repositories {
    google()
    jcenter()
    maven {
      url 'https://maven.fabric.io/public'
    }
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:3.2.0'
  }
}

apply plugin: 'com.android.library'

def DEFAULT_COMPILE_SDK_VERSION = 27
def DEFAULT_BUILD_TOOLS_VERSION = "28.0.2"
def DEFAULT_TARGET_SDK_VERSION = 27
def DEFAULT_SUPPORT_LIB_VERSION = "27.1.1"

android {
  compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION
  buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION
  defaultConfig {
    minSdkVersion 16
    targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
  }
  buildTypes {
    release {
      minifyEnabled false
    }
  }
  productFlavors {
  }
  lintOptions {
    disable 'GradleCompatible'
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

rootProject.gradle.buildFinished { buildResult ->
  if (buildResult.getFailure() != null) {
    //noinspection GroovyUnusedCatchParameter
    try {
      String message = buildResult.getFailure().properties.get("reportableCauses").toString()
      if (message.contains("com.android.dex.DexException: Multiple dex files define Lcom/google/") ||
        message.contains("java.util.zip.ZipException: duplicate entry: com/google/android/gms/")) {
        logger.log(LogLevel.ERROR, "")
        logger.log(LogLevel.ERROR, " -----------------------------------------------------------")
        logger.log(LogLevel.ERROR, "|                    REACT NATIVE FIREBASE                  |")
        logger.log(LogLevel.ERROR, " ----------------------------------------------------------- ")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  This is a common build error when using libraries that   |")
        logger.log(LogLevel.ERROR, "|  require google play services.                            |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  This error occurs because different versions of google   |")
        logger.log(LogLevel.ERROR, "|  play services or google play services modules are being  |")
        logger.log(LogLevel.ERROR, "|  required by different libraries.                         |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  A temporary fix would be to set:                         |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|             android { multiDexEnabled true }              |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  inside your build gradle, however it is recommended for  |")
        logger.log(LogLevel.ERROR, "|  your prod build that you de-duplicate these to minimize  |")
        logger.log(LogLevel.ERROR, "|  bundle size.                                             |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  See http://invertase.link/dupe-dex for how to do this.   |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, " ----------------------------------------------------------- ")
      }
    } catch (Exception exception) {
    }
  }
}

repositories {
  google()
  jcenter()

  def found = false
  def parentDir = rootProject.projectDir
  def androidSourcesName = 'React Native sources'
  def androidPrebuiltBinaryName = 'React Native prebuilt binary'

  1.upto(4, {
    if (found) return true
    parentDir = parentDir.parentFile

    // Running React Native from sources locally or for ExpoKit
    def androidSourcesDir = new File(
      parentDir,
      'node_modules/react-native'
    )

    // Official releases of React Native come with a prebuilt version of Android sources
    // in ./android, e.g. react-native/android/**/react-native-0.57.1.aar
    def androidPrebuiltBinaryDir = new File(
      parentDir,
      'node_modules/react-native/android'
    )

    if (androidPrebuiltBinaryDir.exists()) {
      maven {
        url androidPrebuiltBinaryDir.toString()
        name androidPrebuiltBinaryName
      }

      println "${project.name}: using ${androidPrebuiltBinaryName} from ${androidPrebuiltBinaryDir.toString()}"
      found = true
    } else if (androidSourcesDir.exists()) {
      maven {
        url androidSourcesDir.toString()
        name androidSourcesName
      }

      println "${project.name}: using ${androidSourcesName} from ${androidSourcesDir.toString()}"
      found = true
    }
  })

  if (!found) {
    throw new GradleException(
      "${project.name}: unable to locate React Native android sources or prebuilt binary. " +
        "Ensure you have you installed React Native as a dependency in your project and try again."
    )
  }
}

def supportVersion = rootProject.hasProperty('supportLibVersion') ? rootProject.supportLibVersion : DEFAULT_SUPPORT_LIB_VERSION

dependencies {
  //noinspection GradleDynamicVersion
  api "com.facebook.react:react-native:+"

  /* ----------------------------
   *    REACT NATIVE FIREBASE
   * ---------------------------- */

  // Required dependencies
  //noinspection GradleCompatible
  compileOnly "com.google.firebase:firebase-core:16.0.6"
  compileOnly "com.google.android.gms:play-services-base:16.0.1"

  /* -------------------------
   *   OPTIONAL FIREBASE SDKS
   * ------------------------- */

  // Ads
  compileOnly('com.google.firebase:firebase-ads:15.0.1') {
    // exclude `customtabs` as the support lib version is out of date
    // we manually add it as a dependency below with a custom version
    exclude group: 'com.android.support', module: 'customtabs'
  }
  // Authentication
  compileOnly "com.google.firebase:firebase-auth:16.1.0"
  // Analytics
  compileOnly "com.google.firebase:firebase-analytics:16.0.6"
  // Performance Monitoring
  compileOnly "com.google.firebase:firebase-perf:16.2.3"
  // Remote Config
  compileOnly "com.google.firebase:firebase-config:16.1.2"
  // Cloud Storage
  compileOnly "com.google.firebase:firebase-storage:16.0.5"
  // Invites
  compileOnly "com.google.firebase:firebase-invites:16.0.6"
  // Dynamic Links
  compileOnly "com.google.firebase:firebase-dynamic-links:16.1.5"
  // Real-time Database
  compileOnly "com.google.firebase:firebase-database:16.0.5"
  // Cloud Functions
  compileOnly "com.google.firebase:firebase-functions:16.1.3"
  // Cloud Firestore
  compileOnly "com.google.firebase:firebase-firestore:17.1.5"
  // Cloud Messaging / FCM
  compileOnly "com.google.firebase:firebase-messaging:17.3.4"
  // Crashlytics
  compileOnly('com.crashlytics.sdk.android:crashlytics:2.9.5@aar') {
    transitive = true
  }
  /* --------------------------------
   *  OPTIONAL SUPPORT LIBS
   * -------------------------------- */

  // For Firebase Ads
  compileOnly "com.android.support:customtabs:$supportVersion"

  // For React Native Firebase Notifications
  api "com.android.support:support-v4:$supportVersion"

  // For React Native Firebase Notifications
  compileOnly 'me.leolin:ShortcutBadger:1.1.21@aar'
}
