String AWS_ACCOUNT_ID = '437795906767'
String QA_SECRETS_ROLE = 'qa-swf-yt-conflict-elasticsearch-task-role'
String QA_ES_HOST =  'vpc-qa-conflict-manager-457bxa6tjln2zc7yqubqefz66m.us-east-1.es.amazonaws.com'
String QA_OS_HOST =  'vpc-qa-conflict-manager-os-n4n5ljpdvncuikfolmvkzs4ahu.us-east-1.opensearch.amazonaws.com'
String PROD_SECRETS_ROLE = 'prod-swf-yt-conflict-elasticsearch-task-role'
String PROD_ES_HOST = 'vpc-prod-conflict-manager01-66ikjr5nr6cu6xnpwazxwqhypi.us-east-1.es.amazonaws.com'
String PROD_OS_HOST = ''
String OPENSEARCH_INDEX = 'conflict_write'
String ELASTICSEARCH_INDEX = 'conflicts'
String SLACK_NOTIFICATIONS_CHANNEL = '#conflict-manager-alerts'

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 or Git revision.')
        choice(name: 'Environment', choices: ['prod', 'qa'], description: 'The environment to run against.')
        booleanParam(name: 'RELOAD', defaultValue: false, description: 'when checked is sends to context "reload": "True"')
        booleanParam(name: 'WAIT_UNTIL_COMPLETE', defaultValue: true, description: 'when checked is sends to context "wait_until_complete": "True"')
    }

    environment {
        SECRETS_ROLE = "${params.Environment == 'prod' ? PROD_SECRETS_ROLE : QA_SECRETS_ROLE}"
        AWS_REGION = "us-east-1"
        ELASTICSEARCH_HOST = "${params.Environment == 'prod' ? PROD_ES_HOST : QA_ES_HOST}"
        OPENSEARCH_HOST = "${params.Environment == 'prod' ? PROD_OS_HOST : QA_OS_HOST}"
        ELASTICSEARCH_USE_SSL = "1"
        ELASTICSEARCH_INDEX = "${ELASTICSEARCH_INDEX}"
        OPENSEARCH_INDEX = "${OPENSEARCH_INDEX}"
        FEED_INGESTION_TABLE = "${params.Environment}_feed_ingestion_status"
        RELOAD = "${params.RELOAD ? 'True' : 'False'}"
        SNOWFLAKE_ACCOUNT = "orchard"
        SNOWFLAKE_DATABASE = "FACTS"
        SNOWFLAKE_ROLE = "${params.Environment.toUpperCase()}_YOUTUBE_ASSET_CONFLICT_ES_ETL"
        SNOWFLAKE_SCHEMA = "${params.Environment.toUpperCase()}"
        SNOWFLAKE_USER = "${params.Environment.toUpperCase()}_YOUTUBE_ASSET_CONFLICT_ES_ETL"
        SNOWFLAKE_WAREHOUSE = "${params.Environment.toUpperCase()}_ETL_WAREHOUSE"
        SWF_DOMAIN = "${params.Environment}_yt_conflict_elasticsearch"
        WAIT_UNTIL_COMPLETE = "${params.WAIT_UNTIL_COMPLETE ? 'True' : 'False'}"
    }

    triggers {
        parameterizedCron(
            '''
        00 10 * * * %Environment=prod
        H 02 * * * %Environment=qa
            '''
        )
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                library "jenkins-global-libraries@${params.SHARED_LIBRARIES_VERSION}"
            }
        }
        stage('Run exec job') {
            steps{
                withEcr {
                    withSecrets(awsAccountId: AWS_ACCOUNT_ID, awsRole: SECRETS_ROLE, secrets: [
                        [id: "${params.Environment}/swf-yt-conflict-elasticsearch/AWS_ACCESS_KEY_ID", environmentVariable: 'AWS_ACCESS_KEY_ID'],
                        [id: "${params.Environment}/swf-yt-conflict-elasticsearch/AWS_SECRET_ACCESS_KEY", environmentVariable: 'AWS_SECRET_ACCESS_KEY'],
                        [id: "${params.Environment}/swf-yt-conflict-elasticsearch/SNOWFLAKE_KEY", environmentVariable: 'SNOWFLAKE_KEY'],
                    ]) {
                        withEnv(["Environment=${params.Environment}"]) {
                            sh "make docker_exec"
                        }
                    }
                }
            }
            post {
                cleanup {
                    sh 'make down_exec'
                }
            }
        }
    }
    post {
        regression {
            script {
                if (params.Environment == 'prod') {
                    slackNotify channel: SLACK_NOTIFICATIONS_CHANNEL
                }
            }
        }
        fixed {
            script {
                if (params.Environment == 'prod') {
                    slackNotify channel: SLACK_NOTIFICATIONS_CHANNEL
                }
            }
        }
        cleanup {
            cleanWs()
        }
    }
}
