pipeline {
    agent any

    options {
        ansiColor('xterm')
        disableConcurrentBuilds()
        timestamps()
        buildDiscarder logRotator(
          artifactDaysToKeepStr: '30',
          artifactNumToKeepStr: '100',
          daysToKeepStr: '365',
          numToKeepStr: '1000'
        )
        timeout(time: 3, unit: 'HOURS')
        datadog(
            collectLogs: false,
            tags: [
                "environment:${Env:ENVIRONMENT}",
                "models:${Env:MODELS}",
                "warehouse:${Env:WAREHOUSE}",
                "trigger_tadas:${Env:TRIGGER_TADAS}",
                "clear_cache:${Env:CLEAR_CACHE}"
            ]
        )
    }

    parameters {
        choice(name: 'ENVIRONMENT', choices: ['qa', 'prod'], description: 'The environment to run against.')
        string(name: 'MODELS', defaultValue: '', description: 'Specify which models should be build. For example: "tag:tiktok_v2"')
        string(name: 'WAREHOUSE', defaultValue: '', description: 'Optionally specify snowflake warehouse used for DBT build. Example: PROD_ETL_WAREHOUSE')
        booleanParam(name: 'TRIGGER_TADAS', defaultValue: false, description: 'To trigger TADAS exec')
        booleanParam(name: 'CLEAR_CACHE', defaultValue: false, description: 'To clear all caches after DBT model build')
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                script {
                    currentBuild.displayName = "#${currentBuild.number} ${params.ENVIRONMENT} MODELS: ${params.MODELS} CLEAR_CACHE: ${params.CLEAR_CACHE}"
                }
                library "jenkins-global-libraries@master"
            }
        }

        stage('Build models') {
            when {
                 expression {
                     params.MODELS != ''
                 }
            }
            steps {
                script {
                    build job: 'dbt-scheduler-analytics-build-views',
                        parameters: [
                            string(name: 'MODELS', value: params.MODELS),
                            string(name: 'SNOWFLAKE_SCHEMA', value: params.ENVIRONMENT == 'prod' ? 'PROD' : 'QA'),
                            string(name: 'QA_SNOWFLAKE_WAREHOUSE', value: params.WAREHOUSE != '' ? params.WAREHOUSE : 'QA_DBT_WAREHOUSE'),
                            string(name: 'PROD_SNOWFLAKE_WAREHOUSE', value: params.WAREHOUSE != '' ? params.WAREHOUSE : 'PROD_DBT_WAREHOUSE'),
                            booleanParam(name: 'FORCE_MODEL_UPGRADE', value: true),
                        ]
                }
            }
        }
        stage('exec TADAS') {
            when {
                 expression {
                     params.TRIGGER_TADAS
                 }
            }
            steps {
                script {
                    build job: 'tadas-etl-exec',
                        parameters: [
                            string(name: 'ENVIRONMENT', value: 'qa'),
                        ],
                        propagate: false,
                        wait: false
                }
                script {
                    build job: 'tadas-etl-exec',
                        parameters: [
                            string(name: 'ENVIRONMENT', value: 'prod'),
                        ],
                        propagate: false,
                        wait: false
                }
            }
        }
        stage('Clear cache ows-analytics') {
            when {
                 expression {
                     params.CLEAR_CACHE == true
                 }
            }
            steps {
                script {
                    build job: 'redis-cache-clear',
                    parameters: [
                        string(name: 'REDIS_SERVER', value: params.ENVIRONMENT == 'prod' ? 'prod-ows-analytics.oudhyr.ng.0001.use1.cache.amazonaws.com' : 'qa-ows-analytics.oudhyr.ng.0001.use1.cache.amazonaws.com'),
                        string(name: 'KEY_PATTERN', value: ''),
                    ]
                }
            }
        }
        stage('Clear cache graphql-analytics') {
            when {
                 expression {
                     params.CLEAR_CACHE == true
                 }
            }
            steps {
                script {
                    build job: 'redis-cache-clear',
                    parameters: [
                        string(name: 'REDIS_SERVER', value: params.ENVIRONMENT == 'prod' ? 'master.prod-graphql-analytics.oudhyr.use1.cache.amazonaws.com' : 'master.qa-graphql-analytics.oudhyr.use1.cache.amazonaws.com'),
                        string(name: 'KEY_PATTERN', value: ''),
                        booleanParam(name: 'USE_TLS', value: true),
                    ]
                }
            }
        }
        stage('Prewarm Cache') {
            when {
                 allOf {
                     expression { params.CLEAR_CACHE == true }
                     expression { params.ENVIRONMENT == 'prod' }
                 }
            }
            steps {
                script {
                    build job: 'ows-analytics-cache-warmup'
                }
            }
        }
    }
    post {
        failure {
            script {
                if (params.ENVIRONMENT == 'prod') {
                    slackSend (
                        color: "danger",
                        channel: "#data-alerts",
                        message: """The build ${currentBuild.fullDisplayName} has failed.! ${env.JOB_NAME} - #${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"""
                    )
                }
            }
        }
        aborted {
            script {
                if (params.ENVIRONMENT == 'prod') {
                    slackSend (
                        color: "danger",
                        channel: "#data-alerts",
                        message: """The build ${currentBuild.fullDisplayName} has failed.! ${env.JOB_NAME} - #${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"""
                    )
                }
            }
        }
    }
}
