pipeline {
  agent { label 'linux' }

  options {
    timestamps()
    disableConcurrentBuilds()
    /* Prevent Jenkins jobs from running forever */
    timeout(time: 35, unit: 'MINUTES')
    /* Limit builds retained */
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '20',
      artifactNumToKeepStr: '10',
    ))
  }

  parameters {
    string(
      name: 'BUILD_TYPE',
      description: 'Specify build type. Values: pr / e2e / nightly / release',
      defaultValue: 'pr',
    )
  }

  environment {
    BUILD_PLATFORM = 'android'
    LANG = 'en_US.UTF-8'
    LANGUAGE = 'en_US.UTF-8'
    LC_ALL = 'en_US.UTF-8'
    FASTLANE_DISABLE_COLORS = 1
    REALM_DISABLE_ANALYTICS = 1
    BUNDLE_PATH = "${HOME}/.bundle"
    ANDROID_HOME = '/usr/lib/android-sdk'
    ANDROID_SDK_ROOT = '/usr/lib/android-sdk'
    ANDROID_NDK = '/usr/lib/android-ndk'
    ANDROID_NDK_HOME = '/usr/lib/android-ndk'
  }

  stages {
    stage('Prep') {
      steps {
        script {
          /* Necessary to load methods */
          mobile = load 'ci/mobile.groovy'
          cmn    = load 'ci/common.groovy'
          print "Running ${cmn.getBuildType()} build!"
          /* Cleanup and Prep */
          mobile.prep(cmn.getBuildType())
          /* Run at start to void mismatched numbers */
          cmn.buildNumber()
        }
      }
    }
    stage('Lint') {
      steps {
        script { cmn.runLint() }
      }
    }
    stage('Tests') {
      steps {
        script { cmn.runTests() }
      }
    }
    stage('Build') {
      steps {
        script { mobile.leinBuild('android') }
      }
    }
    stage('Bundle') {
      steps {
        script { apk = mobile.android.bundle(cmn.getBuildType()) }
      }
    }
    stage('Archive') {
      steps {
        archiveArtifacts apk
      }
    }
    stage('Upload') {
      steps {
        script {
          env.PKG_URL = cmn.uploadArtifact(apk)
          /* build type specific */
          switch (cmn.getBuildType()) {
            case 'release':
              mobile.android.uploadToPlayStore(); break;
            case 'nightly':
              env.DIAWI_URL = mobile.android.uploadToDiawi(); break;
            case 'e2e':
              env.SAUCE_URL = mobile.android.uploadToSauceLabs()
          }
        }
      }
    }
    stage('Cleanup') {
      steps {
        script { cmn.clean() }
      }
    }
  }
  post {
    failure { script { load('ci/common.groovy').notifyPRFailure() } }
    success { script { load('ci/common.groovy').notifyPRSuccess() } }
  }
}