properties([
  buildDiscarder(logRotator(
    numToKeepStr: '3',
    daysToKeepStr: '7',
  ))
])

env.LANG="en_US.UTF-8"
env.LANGUAGE="en_US.UTF-8"
env.LC_ALL="en_US.UTF-8"
env.FASTLANE_DISABLE_COLORS=1

def installJSDeps() {
    def attempt = 1
    def maxAttempts = 10
    def installed = false
    while (!installed && attempt <= maxAttempts) {
        println "#${attempt} attempt to install npm deps"
        sh 'scripts/prepare-for-platform.sh mobile'
        sh 'npm install'
        installed = fileExists('node_modules/web3/index.js')
        attemp = attempt + 1
    }
}

timeout(90) {
    node ('fastlane') {
      load "$HOME/env.groovy"

      try {
        stage('Git & Dependencies') {
          slackSend color: 'good', message: BRANCH_NAME + '(' + env.CHANGE_BRANCH + ') build started. ' + env.BUILD_URL

          checkout scm

          try {
            sh 'git rebase origin/develop'
          } catch (e) {
            sh 'git rebase --abort'
            throw e
          }

          sh 'rm -rf node_modules'
          sh 'cp .env.jenkins .env'

          installJSDeps()

          sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack'
          sh 'cd ios && pod install && cd ..'
        }
        stage('Code style checks') {
            sh 'lein cljfmt check'
        }

        stage('Tests') {
          sh 'lein test-cljs'
        }

        stage('Build') {
          sh 'lein prod-build'
        }

        // Android
        stage('Build (Android)') {
          sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease'
        }

        stage('Deploy (Android)') {
          withCredentials([
              string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'),
              string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'),
              string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL')
          ]) {
            sh 'fastlane android upload_diawi'
          }
        }

        // iOS
        stage('Build (iOS)') {
          withCredentials([
              string(credentialsId: "slave-pass-${env.NODE_NAME}", variable: 'KEYCHAIN_PASSWORD'),
              string(credentialsId: 'fastlane-match-password', variable:'MATCH_PASSWORD')]) {
            sh 'fastlane ios adhoc'
          }
        }

        stage('Deploy (iOS)') {
          withCredentials([
              string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'),
              string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'),
              string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL')
          ]) {
            sh 'fastlane ios upload_diawi'
          }
        }

        // Android for e2e
        stage('Build (Android) for e2e tests') {
          sh 'cd android && mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/app-release.original.apk && ENVFILE=.env.e2e ./gradlew assembleRelease'
        }

        stage('Upload apk for e2e tests') {
          if (env.CHANGE_ID != null) {
              env.SAUCE_LABS_APK = env.CHANGE_ID + '.apk'
              withCredentials([
                  string(credentialsId: 'SAUCE_ACCESS_KEY', variable: 'SAUCE_ACCESS_KEY'),
                  string(credentialsId: 'SAUCE_USERNAME', variable: 'SAUCE_USERNAME'),
                  string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'),
                  string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'),
                  string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL')
              ]) {
                sh 'fastlane android saucelabs'
                sh 'fastlane android upload_diawi'
              }
          }
        }

      } catch (e) {
        slackSend color: 'bad', message: BRANCH_NAME + ' failed to build. ' + env.BUILD_URL
        throw e
      }
    }
}