def CURRENT_MODEL_VERSIONS = [
    qa  : 't2604_noamazon_noyoutube',
    prod: 't2604_noamazon_noyoutube'
]

def TADAS_MODEL_VERSIONS = [
    '--current--',
    't2509_snowflake',
    't2511_noamazon',
    't2604_noamazon_noyoutube',
    't2605_amazon_youtube'
]

pipeline {
    agent any

    options {
        ansiColor('xterm')
        disableConcurrentBuilds()
        timestamps()
        buildDiscarder logRotator(
          artifactDaysToKeepStr: '30',
          artifactNumToKeepStr: '100',
          daysToKeepStr: '365',
          numToKeepStr: '1000'
        )
        timeout(time: 2, unit: 'MINUTES')
        datadog(
            collectLogs: false,
            tags: [
                "environment:${Env:ENVIRONMENT}",
                "model_version:${Env:MODEL_VERSION}",
                "report_date:${Env:REPORT_DATE}",
                "config:${Env:CONFIG}",
                "build_user_id:${Env:BUILD_USER_ID}"
            ]
        )
    }

    parameters {
        choice(name: 'ENVIRONMENT', choices: ['qa', 'prod'], description: 'The environment to run against.')
        choice(name: 'MODEL_VERSION', choices: TADAS_MODEL_VERSIONS, description: 'The model version to run.')
        string(name: 'REPORT_DATE', defaultValue: '',  description: 'Optional date to build YYYY-MM-DD, by default it builds 2 days ago')
        string(name: 'CONFIG', defaultValue: 'MAKE_TASKS=inference,publish',  description: 'Override default config settings. Format: NAME=value, separate by "&". Example: REQUIRED_DSPS=apple,spotify&MAKE_TASKS=inference,publish')
        booleanParam(name: 'ONLY_UPDATE_JOB', defaultValue: false, description: 'when checked the Jenkins job only updates itself. No execution triggers')
    }

    triggers {
        parameterizedCron(
            '''
            H H/3 * * * % ENVIRONMENT=qa;CONFIG=MAKE_TASKS=monitor
            H H/4 * * * % ENVIRONMENT=qa;CONFIG=MAKE_TASKS=inference&MODEL_VERSION=t2605_amazon_youtube
            50 * * * * % ENVIRONMENT=prod;CONFIG=MAKE_TASKS=monitor
            '''
        )
    }

    environment {
        CREDENTIALS_ID = "${params.ENVIRONMENT == 'prod' ? 'prod-feed-ingestion-exec-creds' : 'qa-feed-ingestion-exec-creds'}"
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                script {
                    def buildUser = env.BUILD_USER_ID ?: 'unknown'
                    currentBuild.displayName = "#${currentBuild.number} [${params.ENVIRONMENT}] by ${buildUser}"
                }
                library "jenkins-global-libraries@master"
            }
        }
        stage('Run Task') {
            when {
                expression {
                    params.ONLY_UPDATE_JOB == false
                }
            }
            steps {
                script {
                    def resolvedVersion = (params.MODEL_VERSION == '--current--')
                            ? CURRENT_MODEL_VERSIONS[params.ENVIRONMENT]
                            : params.MODEL_VERSION
                    env.RESOLVED_VERSION = resolvedVersion

                    withAWS(
                        role: "${params.ENVIRONMENT}-tadas-etl-task-run-role",
                        roleAccount: '437795906767',
                        region: 'us-east-1',
                        roleSessionName: 'trigger-by-jenkins-tadas-etl-exec',
                        useNode: true
                    ) {
                        sh '''#!/bin/bash
                            ENVIRONMENT=${ENVIRONMENT}
                            SERVICE_NAME=tadas-etl
                            FARGATE_NAME=${ENVIRONMENT}-${SERVICE_NAME}

                            SUBNETS=$(aws ecs describe-services \
                              --cluster $FARGATE_NAME \
                              --services $FARGATE_NAME \
                              --query "services[0].networkConfiguration.awsvpcConfiguration.subnets" \
                              --output json | jq -rc . | sed '\''s/"//g'\'' )

                            echo SUBNETS: $SUBNETS

                            SECURITY_GROUPS=$(aws ecs describe-services \
                              --cluster $FARGATE_NAME \
                              --services $FARGATE_NAME \
                              --query "services[0].networkConfiguration.awsvpcConfiguration.securityGroups" \
                              --output json | jq -c . | sed '\''s/"//g'\'' )

                            echo SECURITY_GROUPS $SECURITY_GROUPS

                            TASK_DEFINITION=$(aws ecs list-task-definitions \
                              --family-prefix $FARGATE_NAME \
                              --sort DESC \
                              --max-items 1 \
                              --query "taskDefinitionArns[0]" \
                              --output text | awk -F/ '\''{print $2}'\'')

                            echo TASK_DEFINITION $TASK_DEFINITION

                            aws ecs run-task \
                              --no-cli-pager \
                              --cluster $FARGATE_NAME \
                              --launch-type FARGATE \
                              --task-definition $TASK_DEFINITION \
                              --network-configuration "awsvpcConfiguration={subnets=$SUBNETS,securityGroups=$SECURITY_GROUPS,assignPublicIp=DISABLED}" \
                              --overrides '\''{
                                "containerOverrides": [{
                                  "name": "'\''$SERVICE_NAME'\''",
                                  "environment": [
                                    {"name": "REPORT_DATE", "value": "'\''${REPORT_DATE}'\''"},
                                    {"name": "MODEL_VERSION", "value": "'\''${RESOLVED_VERSION}'\''"}
                                  ],
                                  "command": ["--env='\''${CONFIG}'\''"]
                                }]
                              }'\''
                        '''
                    }
                }
            }
        }
    }
    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>)"""
                    )
                }
            }
        }
    }
}