String AWS_ACCOUNT_ID = '437795906767'
String QA_S3_ASSUME_ROLE = 'qa-invoke-hive-ai-detection-jenkins-role'
String PROD_S3_ASSUME_ROLE = 'prod-invoke-hive-ai-detection-jenkins-role'
String SLACK_NOTIFICATIONS_CHANNEL = '#distro-build-alerts'
String PROD_SNOWFLAKE_USER = 'PROD_INVOKE_HIVE_AI_DETECTION'
String QA_SNOWFLAKE_USER = 'QA_INVOKE_HIVE_AI_DETECTION'
String PROD_SNOWFLAKE_WAREHOUSE = 'PROD_OWS_WAREHOUSE'
String QA_SNOWFLAKE_WAREHOUSE = 'QA_OWS_WAREHOUSE'

pipeline {
    agent any

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

    parameters {
        choice(
            name: 'ENVIRONMENT',
            choices: ['prod', 'qa'],
            description: 'Environment to run the check against'
        )
        string(
            name: 'LABEL_ID',
            defaultValue: '',
            description: 'Comma separated Label Id'
        )
        string(
            name: 'ARTIST_ID',
            defaultValue: '',
            description: 'Comma separated Artist Id'
        )
        string(
            name: 'SUBACCOUNT_ID',
            defaultValue: '',
            description: 'Comma separated Subaccount Id'
        )
        string(
            name: 'PRODUCT_ID',
            defaultValue: '',
            description: 'Comma separated Product Id'
        )
        choice(
            name: 'CONCURRENCY',
            choices: ['3', '1', '2', '4', '5', '6', '7', '8', '9', '10', '11'],
            description: 'Number of concurrent lambda invocations between 1 to 11'
        )
        string(
            name: 'BATCH_SIZE',
            defaultValue: '1',
            description: 'Number of assets to process per lambda invocation'
        )
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                library "jenkins-global-libraries@master"
            }
        }

        stage('Invode Hive AI Detection') {
            steps {
                script {
                    S3_ASSUME_ROLE = "${params.ENVIRONMENT == "prod" ? PROD_S3_ASSUME_ROLE : QA_S3_ASSUME_ROLE}"

                    if (
                        !params.LABEL_ID?.trim() &&
                        !params.ARTIST_ID?.trim() &&
                        !params.SUBACCOUNT_ID?.trim() &&
                        !params.PRODUCT_ID?.trim()
                    ) {
                        error "Please enter a value for Label Id, Artist Id, Subaccount Id, or Product Id."
                    }

                    withEcr {
                        withAWS(
                            roleAccount: AWS_ACCOUNT_ID,
                            role: S3_ASSUME_ROLE,
                            roleSessionName: env.BUILD_TAG,
                            useNode: true
                        ) {
                            withEnv([
                                "ENVIRONMENT=${params.ENVIRONMENT}",
                                "LABEL_ID=${params.LABEL_ID}",
                                "ARTIST_ID=${params.ARTIST_ID}",
                                "SUBACCOUNT_ID=${params.SUBACCOUNT_ID}",
                                "PRODUCT_ID=${params.PRODUCT_ID}",
                                "DELIVERY_TYPE=${params.DELIVERY_TYPE}",
                                "BUILD_NUMBER=${env.BUILD_NUMBER}",
                                "CONCURRENCY=${params.CONCURRENCY}",
                                "BATCH_SIZE=${params.BATCH_SIZE}",
                                "TIMEOUT=${params.TIMEOUT}",
                                "SNOWFLAKE_USER=${params.ENVIRONMENT == "prod" ? PROD_SNOWFLAKE_USER : QA_SNOWFLAKE_USER}",
                                "SNOWFLAKE_WAREHOUSE=${params.ENVIRONMENT == "prod" ? PROD_SNOWFLAKE_WAREHOUSE : QA_SNOWFLAKE_WAREHOUSE}",
                                "SNOWFLAKE_ACCOUNT=delphi.us-east-1",
                                "SNOWFLAKE_ROLE=INVOKE_HIVE_AI_DETECTION",
                                "SNOWFLAKE_DATABASE=ORCHARD_APP_REPORTING_V2",
                                "SNOWFLAKE_SCHEMA=ART_RELATIONS_PROD_ART_RELATIONS",
                                "AWS_REGION=us-east-1",
                                "AWS_DEFAULT_REGION=us-east-1"

                            ]) {
                                dir('invoke-hive-ai-detection') {
                                    sh """
                                        docker compose run --rm --build \
                                            -e ENVIRONMENT \
                                            -e LABEL_ID \
                                            -e ARTIST_ID \
                                            -e SUBACCOUNT_ID \
                                            -e PRODUCT_ID \
                                            -e CONCURRENCY \
                                            -e BATCH_SIZE \
                                            -e SNOWFLAKE_USER \
                                            -e SNOWFLAKE_WAREHOUSE \
                                            -e SNOWFLAKE_ACCOUNT \
                                            -e SNOWFLAKE_ROLE \
                                            -e SNOWFLAKE_DATABASE \
                                            -e SNOWFLAKE_SCHEMA \
                                            -e AWS_REGION \
                                            -e AWS_DEFAULT_REGION \
                                            cli
                                    """
                                }
                            }
                        }
                    }
                }
            }
            post {
                cleanup {
                    cleanWs()
                }
            }
        }
    }

    post {
        failure {
            script {
                slackNotify channel: SLACK_NOTIFICATIONS_CHANNEL
            }
        }
        cleanup {
            cleanWs()
        }
    }
}
