#!groovy

@Library('infraLib') _

pipeline {
  agent {
    label 'linux-agents'
  }

  options {
    disableConcurrentBuilds()
    ansiColor('xterm')
  }

  environment {
    TF_IN_AUTOMATION = 1

    NOTIFICATIONS_CHANNEL = 'auth0-deployment'

    BASE_PATH = "${WORKSPACE}/modules/terraform"
  }

  stages {
    stage('a0deploy') {
      environment {
        BASE_PATH = "${WORKSPACE}/modules/auth0_deploy_cli"
      }
      stages {
        stage('Build') {
          steps {
            sh "cd ${env.BASE_PATH} && make docker/image/build"
          }
        }
        stage('Publish') {
          steps {
            sh "cd ${env.BASE_PATH} && make docker/login"
            sh "cd ${env.BASE_PATH} && make docker/image/push"
          }
        }
      }
    }
    stage('Development') {
      environment {
        ENV_PREFIX = 'dev'
        WORK_DIR = "${env.BASE_PATH}/${env.ENV_PREFIX}"
        SECRET_PREFIX = "infra/jenkins/apollo/${env.ENV_PREFIX}/auth0_terraform"
        AUTH0_DOMAIN = utility.getSecretValueById("${env.SECRET_PREFIX}/AUTH0_DOMAIN", "gdb-delphi-dev")
        AUTH0_CLIENT_ID = utility.getSecretValueById("${env.SECRET_PREFIX}/AUTH0_CLIENT_ID", "gdb-delphi-dev")
        AUTH0_CLIENT_SECRET = utility.getSecretValueById("${env.SECRET_PREFIX}/AUTH0_CLIENT_SECRET", "gdb-delphi-dev")

        TF_VAR_acc_auth_user = utility.getSecretValueById("${env.SECRET_PREFIX}/ACC_AUTH_USER", "gdb-delphi-dev")
        TF_VAR_acc_auth_pass = utility.getSecretValueById("${env.SECRET_PREFIX}/ACC_AUTH_PASS", "gdb-delphi-dev")

        TF_VAR_smtp_user = utility.getSecretValueById("${env.SECRET_PREFIX}/SMTP_USER", "gdb-delphi-dev")
        TF_VAR_smtp_pass = utility.getSecretValueById("${env.SECRET_PREFIX}/SMTP_PASS", "gdb-delphi-dev")
      }
      matrix {
        axes {
          axis {
            name 'MODULE'
            values 'rules', 'emails', 'Main'
          }
        }
        stages {
          stage('Init') {
            steps {
              sh "cd ${env.WORK_DIR}/${env.MODULE} && terraform get -update"
              sh "cd ${env.WORK_DIR}/${env.MODULE} && terraform init -input=false"
            } /** end: steps */
          } /** end: stage */

          stage('Validate') {
            steps {
              sh "cd ${env.WORK_DIR}/${env.MODULE} && terraform validate"
            } /** end: steps */
          } /** end: stage */

          stage('Plan') {
            steps {
              sh """
                    cd ${env.WORK_DIR}/${env.MODULE} && terraform plan --out=plan.tfplan -no-color -input=false | \
                    csplit -f plan -q -z - '%------------------------------------------------------------------------%'
                  """
            } /** end: steps */
          } /** end: stage */
        } /** end: stages */
      } /** end: matrix */
      post {
        success {
          script {
            def terraformPlan = ""
            def WORK_DIR = "${env.BASE_PATH}/dev"
            ['rules', 'emails', 'Main'].each {
              if (fileExists("${WORK_DIR}/${it}/plan00")) {
                terraformPlan += "## ${it}\n\n"
                terraformPlan += "```"
                terraformPlan += sh(returnStdout: true, script: "cat ${WORK_DIR}/${it}/plan00")
                terraformPlan += "```"
                terraformPlan += "\n\n"
              } /** end: if */
            } /** end: each */
            if (terraformPlan?.trim() && env.CHANGE_ID) {
              pullRequest.comment("${terraformPlan}")
            }
          } /** end: script */
        } /** end: success */
      } /** end: post */
    } /** end: stage */
  } /** end: stages */
  post {
    always {
      script {
        utility.slackNotify(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
      }
    }
  }
} /** end: pipeline */
