def REGISTRY_URL = 'docker.io'
def REPO_NAME = 'zhenyus'
def IMAGE_NAME = 'magicleaps'
def APP_NAME = 'magicleaps'
def TAG_PREFIX = 'snapshot'
def DOCKER_REGISTRY_SECRET = 'kaniko-secret'

pipeline {
  agent any

  stages {
    stage('Checkout') {
      steps {
        git credentialsId: 'freeleaps-azure-dev', url: 'https://freeleaps@dev.azure.com/freeleaps/magicleaps/_git/magicleaps'
      }
    }

    stage('Set Commit Hash') {
      steps {
        script {
          def commitHash = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
          def shortCommitHash = commitHash.take(7)
          env.COMMIT_HASH = shortCommitHash
          echo "Commit Hash: ${env.COMMIT_HASH}"
          env.TRIGGERED_BRANCH = "${GIT_BRANCH}"
          echo "Triggered Branch: ${env.TRIGGERED_BRANCH}"
        }
      }
    }

    stage('Build Docker Images For Each Components') {
      matrix {
        axes {
          axis {
            name 'COMPONENT'
            values 'backend', 'frontend'
          }
          axis {
            name 'ARCH'
            values 'linux/amd64'
          }
        }

        agent {
          kubernetes {
            defaultContainer 'kaniko'
            yaml """
        apiVersion: v1
        kind: Pod
        metadata:
        labels:
          freeleaps-devops-job: magicleaps-app-build
          freeleaps-devops-app: magicleaps
        spec:
          containers:
          - name: kaniko
            image: gcr.io/kaniko-project/executor:debug
            command:
            - cat
            tty: true
            volumeMounts:
            - name: kaniko-secret
              mountPath: /kaniko/.docker/config.json
              subPath: .dockerconfigjson
            - name: workspace
              mountPath: /workspace
          volumes:
            - name: kaniko-secret
              secret:
                secretName: kaniko-secret
            - name: workspace
              emptyDir: {}
        """
          }
        }

        stages {
          stage('Image Building') {
            steps {
              script {
                def dockerfilePath = "${COMPONENT}/Dockerfile"
                def arch = "${ARCH}"
                def archTag = arch.replace('/', '-')
                def targetImage = "${REGISTRY_URL}/${REPO_NAME}/${IMAGE_NAME}:${COMPONENT}-${TAG_PREFIX}-${COMMIT_HASH}-${archTag}"
                echo "Building Docker image ${targetImage}..."

                sh """
                  /kaniko/executor \
                    --dockerfile=${dockerfilePath} \
                    --context=${COMPONENT} \
                    --destination=${targetImage} \
                    --custom-platform=${ARCH} \
                    --skip-tls-verify=true \
                    --ignore-path=/product_uuid
                """
              }
            }
          }
        }
      }
    }

    stage('Deploy with Argo CD') {
      stages {
        stage('Clone GitOps Manifests Repo') {
          steps {
            git credentialsId: 'freeleaps-azure-dev', url: 'https://freeleaps@dev.azure.com/freeleaps/freeleaps-ops/_git/freeleaps-ops'
          }
        }

        stage('Automate Update Application Image Tag') {
          steps {
            script {
              def triggeredBranch = "${TRIGGERED_BRANCH}"
              if (triggeredBranch == 'origin/master') {
                echo "Triggered branch is master, deploying to alpha..."
                def valuesFile = APP_NAME + '/helm-pkg/' + APP_NAME + '/values.alpha.yaml'
                def data = readYaml (file: valuesFile)
                data.backend.image.tag = "backend-${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
                data.frontend.image.tag = "frontend-${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
                writeYaml file: valuesFile, data: data, overwrite: true
                // git push
                withCredentials([string(credentialsId: 'freeleaps-azure-dev-token-only', variable: 'GIT_CREDENTIALS')]) {
                  sh """
                    git config user.name "zhenyus"
                    git config user.email "zhenyus@mathmast.com"
                    git remote add ci_origin https://zhenyus:${GIT_CREDENTIALS}@dev.azure.com/freeleaps/freeleaps-ops/_git/freeleaps-ops
                    git add ${valuesFile}
                    git commit -m "ci(bot-auto-bump): bump ${APP_NAME} image tags for alpha to ${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
                    git push ci_origin HEAD:master
                    """
                }
                echo "Update ${APP_NAME} image tags for alpha to ${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64."
              }
            }
          }
        }
      }
    }
  }
}