library 'status-react-jenkins@v1.1.4'

pipeline {
  agent { label 'linux' }

  options {
    timestamps()
    /* Prevent Jenkins jobs from running forever */
    timeout(time: 45, unit: 'MINUTES')
    /* Limit builds retained */
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '20',
      artifactNumToKeepStr: '10',
    ))
    /* Allows combined build to copy */
    copyArtifactPermission('/status-react/*')
  }

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

  environment {
    LANG     = "en_US.UTF-8"
    LC_ALL   = "en_US.UTF-8"
    LANGUAGE = "en_US.UTF-8"
    TARGET   = 'android'
    BUILD_ENV = 'prod'
    NIX_CONF_DIR = "${env.WORKSPACE}/nix"
    FASTLANE_DISABLE_COLORS = 1
    /* coverage report identification */
    COVERALLS_SERVICE_NAME = "jenkins"
    COVERALLS_SERVICE_JOB_ID = "${JOB_NAME}#${BUILD_NUMBER}"
  }

  stages {
    stage('Prep') {
      steps {
        script {
          btype = utils.getBuildType()
          print "Running ${btype} build!"
          jenkins.abortPreviousRunningBuilds()
          /* Cleanup and Prep */
          commonPrep(btype)
        }
      }
    }
    stage('Parallel Assemble') {
      parallel {
        stage('Checks') { stages {
          stage('Lint') {
            steps {
              script {
                /* We want the build result to be uploaded */
                catchError(
                  message: 'Linting check failed!',
                  buildResult: 'FAILURE',
                  stageResult: 'FAILURE'
                ) {
                  sh 'make lint'
                }
              }
            }
          }
          stage('Tests') {
            steps {
              script {
                sh 'make test'
              }
            }
          }
        } }
        stage('Build') { stages {
          stage('Bundle') {
            steps {
              script { apks = android.bundle() }
            }
          }
        } }
      }
    }
    stage('Parallel Upload') {
      parallel {
        stage('Archive') {
          steps { script {
            apks.each { archiveArtifacts it }
          } }
        }
        stage('Upload') {
          steps {
            script {
              def urls = apks.collect { s3.uploadArtifact(it) }
              /* return only the universal APK */
              if (urls.size() > 1) { 
                env.PKG_URL = urls.find { it.contains('universal') }
              } else { /* if no universal is available pick first */
                env.PKG_URL = urls.first()
              }
              /* build type specific */
              switch (btype) {
                case 'release':
                  android.uploadToPlayStore(); break;
                case 'nightly':
                  env.DIAWI_URL = android.uploadToDiawi(); break;
                case 'e2e':
                  env.SAUCE_URL = android.uploadToSauceLabs(); break;
              }
            }
          }
        }
      }
    }
    stage('Cleanup') {
      steps {
        sh 'make clean'
      }
    }
  }
  post {
    success { script { github.notifyPR(true) } }
    failure { script { github.notifyPR(false) } }
    always { sh 'make _fix-node-perms' }
  }
}