pipeline {
    agent any

    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, Git revision or PR ref (e.g. pull/PR_NUMBER/merge).')
        booleanParam(name: 'DEPLOY_TO_PROD', defaultValue: false, description: 'Deploy to production environment')
        choice(name: 'DISABLE_PROD_DEPLOY', choices: ['No', 'Yes'], description: 'Whether or not to disable prod deployment stage')
        string(name: 'SERVICE_NAME', defaultValue: 'maxwells', description: 'Name of maxwells service to deploy, minus environment prefix - e.g. maxwells, maxwells-neo4j-kinesis')
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                library "jenkins-global-libraries@${params.SHARED_LIBRARIES_VERSION}"
            }
        }
        stage('Compliance Checks') {
            steps {
                complianceChecks()
            }
        }
        stage('Validate Software Catalog Definition') {
            steps {
                echo "Validating Software Catalog Definition for orchard-maxwells-daemon"
                datadogSoftwareCatalogValidate(serviceDefinitionFilePath: "software_catalog/${params.SERVICE_NAME}.yaml")
            }
        }
        stage('Get Git Commit') {
            steps {
                script {
                    def scmVars = checkout(scm)
                    GIT_COMMIT = scmVars.GIT_COMMIT ?: sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
                }
            }
        }
        stage('Create a release') {
            steps { 
                // Clean up stale docker credentials
                sh 'rm -f ~/.dockercfg ~/.docker/config.json || true'

                script {
                    // Configure registry
                    docker.withRegistry('https://437795906767.dkr.ecr.us-east-1.amazonaws.com', 'ecr:us-east-1:jenkins-ecr-deploy') {

                        // Build and push image
                        def customImage = docker.build("orchard-maxwells-daemon:${GIT_COMMIT}")
                        customImage.push()
                    }
                }
            }
        }
        stage('Deploy to QA') {
            steps {
                script {
                    build job: 'orchard-docker-fargate-deploy', parameters: [
                        string(name: 'GIT_COMMIT', value: GIT_COMMIT),
                        string(name: 'ENV', value: "qa"),
                        string(name: 'SERVICE_NAME', value: params.SERVICE_NAME),
                        string(name: 'IMAGE_NAME_OVERRIDE', value: 'orchard-maxwells-daemon'),
                    ]
                }
            }
        }
        stage('Integration tests') {
            steps {
                echo "One day someone will test me!"
            }
        }
        stage('Deploy to Prod') {
            when {
                allOf {
                    branch 'master'
                    expression { params.DEPLOY_TO_PROD }
                }
            }
            steps {
                script {
                    echo "Deploying to PROD for orchard-maxwells-daemon"
                    if(params.DISABLE_PROD_DEPLOY == 'No'){
                        build job: 'orchard-docker-fargate-deploy', parameters: [
                            string(name: 'GIT_COMMIT', value: GIT_COMMIT),
                            string(name: 'ENV', value: "prod"),
                            string(name: 'SERVICE_NAME', value: params.SERVICE_NAME),
                            string(name: 'IMAGE_NAME_OVERRIDE', value: 'orchard-maxwells-daemon'),
                        ]
                        datadogSoftwareCatalogPublish(serviceDefinitionFilePath: "software_catalog/${params.SERVICE_NAME}.yaml")
                    }
                    else{
                        // Let the user know they disabled prod deployments
                        println "DISABLE_PROD_DEPLOY was set to Yes, so skip the prod deployment stage"
                    }
                }
            }
        }
    }

    post {
        regression {
            script {
                if (env.BRANCH_NAME == 'master') {
                    slackNotify channel: '#devops-internal-alerts'
                }
            }
        }
        fixed {
            script {
                if (env.BRANCH_NAME == 'master') {
                    slackNotify channel: '#devops-internal-alerts'
                }
            }
        }
        cleanup {
            cleanWs()
        }
    }
}
