ATLANTIS_SERVICES = [
    [serviceName: 'atlantis'],
    [serviceName: 'atlantis-core'],
    [serviceName: 'infra-atlantis'],
]

pipeline {
    agent {
        label 'aws'
    }

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

    parameters {
        string(name: 'SHARED_LIBRARIES_VERSION', defaultValue: 'master', description: 'The version of the Jenkins shared libraries to use. Can be a branch, tag or Git revision.')
    }

    triggers {
        issueCommentTrigger('.*retest this please.*')
    }

    environment {
        ENVIRONMENT = "shared"
        SERTVICE_NAME = "atlantis"
        AWS_REGION = "us-east-1"
        ACCOUNT_ID = "086679231553"
        DEPLOYMENT_ROLE = 'shared-jenkins-pipeline-deploy-role'
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                library "jenkins-global-libraries@${params.SHARED_LIBRARIES_VERSION}"
            }
        }
        stage('Validate Software Catalog Definitions') {
            steps {
                script {
                    parallel(ATLANTIS_SERVICES.collectEntries {service ->
                        [
                            (service.serviceName): {
                                echo "Validating Software Catalog definition for ${service.serviceName}"
                                datadogSoftwareCatalogValidate(serviceDefinitionFilePath: "software_catalog/${service.serviceName}.yaml")
                            }
                        ]
                    })
                }
            }
        }
        stage('Create a Release') {
            when {
                anyOf {
                    branch 'master'
                    expression { env.GITHUB_COMMENT =~ 'build docker' }
                }
            }
            steps {
                dockerToEcr awsRegions: [AWS_REGION], ecrAccountId: ACCOUNT_ID, imageName: SERTVICE_NAME, imageTag: env.GIT_COMMIT
            }
        }
//        ECR scans do not support Alpine 3.19 yet
//        stage('Scan Docker Image') {
//            when {
//                anyOf {
//                    branch 'master'
//                    expression { env.GITHUB_COMMENT =~ 'build docker' }
//                }
//            }
//            steps {
//                dockerScan awsRegion: AWS_REGION, ecrAccountId: ACCOUNT_ID, imageName: SERTVICE_NAME, imageTag: env.GIT_COMMIT
//            }
//        }
        stage('Deploy') {
            when {
                branch 'master'
            }
            steps {
                script {
                    parallel(
                        'atlantis': {
                            fargateDeploy environment: ENVIRONMENT,
                                serviceName: SERTVICE_NAME,
                                awsRegions: [AWS_REGION],
                                ecrRegistryAccountId: ACCOUNT_ID,
                                imageNameOverride: SERTVICE_NAME,
                                gitCommit: env.GIT_COMMIT,
                                awsDeploymentTargetAccountId: ACCOUNT_ID,
                                awsDeploymentRoleName: DEPLOYMENT_ROLE,
                                updateTimeout: 600
                        },
                        'atlantis-core': {
                            fargateDeploy environment: ENVIRONMENT,
                                serviceName: 'atlantis-core',
                                awsRegions: [AWS_REGION],
                                ecrRegistryAccountId: ACCOUNT_ID,
                                imageNameOverride: SERTVICE_NAME,
                                gitCommit: env.GIT_COMMIT,
                                awsDeploymentTargetAccountId: ACCOUNT_ID,
                                awsDeploymentRoleName: DEPLOYMENT_ROLE,
                                updateTimeout: 600
                        }
                    )
                }
            }
        }
        stage('Publish Software Catalog Definitions') {
            when {
                branch 'master'
            }
            steps {
                script {
                    parallel(ATLANTIS_SERVICES.collectEntries {service ->
                        [
                            (service.serviceName): {
                                echo "Publishing Software Catalog definition for ${service.serviceName}"
                                datadogSoftwareCatalogPublish(serviceDefinitionFilePath: "software_catalog/${service.serviceName}.yaml")
                            }
                        ]
                    })
                }
            }
        }
    }
}

