#!groovy

pipeline {
  agent none

  options {
    buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '10')
    lock("${params.TF_WORKSPACE}")
    ansiColor('xterm')
  }

  parameters {
    string defaultValue: '', description: 'API pull request or branch name', name: 'API_PULL_REQUEST_OR_BRANCH', trim: true
    string defaultValue: '', description: 'UI pull request or branch name', name: 'UI_PULL_REQUEST_OR_BRANCH', trim: true
    choice choices: ['test1', 'test2', 'test3', 'test4', 'test5'],
           description: 'Select environment',
           name: 'TF_WORKSPACE'
    booleanParam defaultValue: true,
             description: 'Check if you need to create a clone of db cluster',
             name: 'CREATE_DB'
  }

  environment {
    API_BRANCH_NAME = "${params.API_PULL_REQUEST_OR_BRANCH}".replaceAll('/', '%252F')
    UI_BRANCH_NAME  = "${params.UI_PULL_REQUEST_OR_BRANCH}".replaceAll('/', '%252F')
    TF_WORKSPACE    = "${params.TF_WORKSPACE}"
  }

  stages {
    stage('info') {
      steps {
        script {
          currentBuild.displayName = "${env.TF_WORKSPACE}"
          currentBuild.description = """
            <p><a href="https://${env.TF_WORKSPACE}.decibel.stream">${env.TF_WORKSPACE}.decibel.stream</a></p>
            <p>API: ${env.API_BRANCH_NAME}</p>
            <p>UI: ${env.UI_BRANCH_NAME}</p>
          """
        }
      }
    }

    stage('Create infra') {
      steps {
        build job: "Decibel/deploy-infra", parameters: [
          string(name: 'TF_WORKSPACE', value: env.TF_WORKSPACE),
          string(name: 'TF_VAR_api_branch', value: env.API_BRANCH_NAME),
          string(name: 'TF_VAR_ui_branch', value: env.UI_BRANCH_NAME),
          booleanParam(name: 'CREATE_DB', value: params.CREATE_DB)
        ]
      } /** end: steps */
    } /** end: stage */

    stage('Build') {
      failFast true
      parallel {
        stage('API') {
          when {
            not { expression { ['master', 'develop', 'qa', 'release', 'production'].contains(env.API_BRANCH_NAME) } }
          }
          steps {
            script {
              build job: "Decibel/pipelines/marketing-data-entry/${env.API_BRANCH_NAME}", parameters: [
                string(name: 'DEPLOY_ENV_CHOICE', value: env.TF_WORKSPACE),
                string(name: 'TRIGGER_DEPLOY', value: 'yes'),
                string(name: 'IMAGE_UPLOAD_MODE', value: 'error'),
                string(name: 'SKIP_RELEASE_CREATION', value: 'no'),
                booleanParam(name: 'SKIP_LINT', value: true),
                booleanParam(name: 'SKIP_TESTS', value: true),
                string(name: 'OVERRIDDEN_DOCKER_IMAGE_TAG', value: env.TF_WORKSPACE)
              ]
            }
          } /** end: steps */
        } /** end: stage */

        stage('UI') {
          when {
            not { expression { ['master', 'develop', 'qa', 'release', 'production'].contains(env.UI_BRANCH_NAME) } }
          }
          steps {
            script {
              build job: "Decibel/pipelines/mct-frontend/${env.UI_BRANCH_NAME}", parameters: [
                booleanParam(name: 'SKIP_UNIT_TEST', value: true),
                booleanParam(name: 'SKIP_UI_TEST', value: true),
                string(name: 'OVERRIDDEN_DOCKER_IMAGE_TAG', value: env.TF_WORKSPACE)
              ]
            }
          } /** end: steps */
        } /** end: stage */
      } /** end: parallel */
    } /** end: stage */

    stage('Destroy infra approval') {
      options {
        timeout(time: 2, unit: 'DAYS')
      }

      input {
        message 'Destroy infrastructure?'
        ok 'Yes'
      }

      steps {
        echo "we received approval"
      } /** end: steps */
    } /** end: stage */
    stage('Remove labels') {
      parallel {
        stage('API') {
          when {
            not { expression { ['master', 'develop', 'qa', 'release', 'production'].contains(env.API_BRANCH_NAME) } }
          }
          steps {
            script {
              build job: "Decibel/pipelines/marketing-data-entry/${env.API_BRANCH_NAME}", parameters: [
                string(name: 'DEPLOY_ENV_CHOICE', value: env.TF_WORKSPACE),
                string(name: 'TRIGGER_DEPLOY', value: 'no'),
                string(name: 'IMAGE_UPLOAD_MODE', value: 'skip_build'),
                string(name: 'SKIP_RELEASE_CREATION', value: 'yes'),
                booleanParam(name: 'SKIP_LINT', value: true),
                booleanParam(name: 'SKIP_TESTS', value: true),
                booleanParam(name: 'REMOVE_LABEL', value: true),
                string(name: 'OVERRIDDEN_DOCKER_IMAGE_TAG', value: env.TF_WORKSPACE)
              ]
            }
          } /** end: steps */
        } /** end: stage */

        stage('UI') {
          when {
            not { expression { ['master', 'develop', 'qa', 'release', 'production'].contains(env.UI_BRANCH_NAME) } }
          }
          steps {
            script {
              build job: "Decibel/pipelines/mct-frontend/${env.UI_BRANCH_NAME}", parameters: [
                booleanParam(name: 'SKIP_UNIT_TEST', value: true),
                booleanParam(name: 'SKIP_UI_TEST', value: true),
                booleanParam(name: 'REMOVE_LABEL', value: true),
                string(name: 'OVERRIDDEN_DOCKER_IMAGE_TAG', value: env.TF_WORKSPACE)
              ]
            }
          } /** end: steps */
        } /** end: stage */
      } /** end: parallel */
    } /** end: stage */
  } /** end: stages */
  post {
    always {
      build job: "Decibel/destroy-infra", parameters: [
        string(name: 'TF_WORKSPACE', value: env.TF_WORKSPACE)
      ]
    }
  }
}
