String AWS_ACCOUNT_ID = '437795906767'
String AWS_ASSUME_ROLE = 'prod-meta-force-takedown-jenkins-role'
String SLACK_NOTIFICATIONS_CHANNEL = '#sound-recording-alerts'
String S3_TEST_BUCKET = 'qa-sr-interm-delivery-bucket'
String S3_PROD_BUCKET = 'orchard-audio-delivery'

pipeline {
    agent any

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

    parameters {
        string(name: 'SHARED_LIBRARIES_VERSION', defaultValue: 'master', description: 'The version of the Jenkins shared libraries to use.')
        stashedFile(
            name: 'ISRC_FILE',
            description: 'Upload a file containing ISRCs (one ISRC per line).'
        )
        choice(
            name: 'DELIVERY_MODE',
            choices: ['s3_test', 's3_production', 'sftp'],
            description: "Delivery destination. s3_test = QA bucket '${S3_TEST_BUCKET}' (safe), s3_production = Meta production bucket '${S3_PROD_BUCKET}', sftp = legacy SFTP delivery."
        )
        string(
            name: 'BATCH_SIZE',
            defaultValue: '100',
            description: 'Number of ISRCs to process before sleeping.'
        )
        string(
            name: 'SLEEP_SECONDS',
            defaultValue: '10',
            description: 'Seconds to sleep between batches.'
        )
        string(
            name: 'SINCE',
            defaultValue: '',
            description: '(Optional) Resume processing after this ISRC.'
        )

        // --- SFTP Overrides (only used when DELIVERY_MODE = sftp) ---
        string(
            name: 'SECRET_ARN',
            defaultValue: 'arn:aws:secretsmanager:us-east-1:437795906767:secret:prod/lambda-sr-delivery-meta/META_SFTP_PKEY-bNPPQU',
            description: '(Advanced) AWS Secrets Manager ARN of Meta SFTP key. Only used when DELIVERY_MODE = sftp.'
        )
        string(
            name: 'SFTP_SERVER',
            defaultValue: 's-eaeb3091ded4453fa.server.transfer.us-west-2.amazonaws.com',
            description: '(Advanced) Meta SFTP server hostname. Only used when DELIVERY_MODE = sftp.'
        )
        string(
            name: 'SFTP_USER',
            defaultValue: 'orchard',
            description: '(Advanced) Meta SFTP username. Only used when DELIVERY_MODE = sftp.'
        )
        string(
            name: 'SFTP_PORT',
            defaultValue: '22',
            description: '(Advanced) Meta SFTP port. Only used when DELIVERY_MODE = sftp.'
        )
        string(
            name: 'SFTP_DIR',
            defaultValue: 'fingerprinting',
            description: '(Advanced) Meta SFTP directory to upload into. Only used when DELIVERY_MODE = sftp.'
        )
    }

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

        stage('Validate & Prepare Input') {
            steps {
                script {
                    def fileUploaded = false
                    withFileParameter(name: 'ISRC_FILE', allowNoFile: true) {
                        def status = sh(
                            script: '''
                                if [ -n "$ISRC_FILE" ] && [ -s "$ISRC_FILE" ]; then
                                    cp "$ISRC_FILE" "$WORKSPACE/isrcs.txt"
                                    exit 0
                                else
                                    exit 1
                                fi
                            ''',
                            returnStatus: true
                        )

                        if (status == 0 && fileExists("${env.WORKSPACE}/isrcs.txt")) {
                            fileUploaded = true
                        }
                    }

                    if (!fileUploaded) {
                        error "You must upload an ISRC_FILE."
                    }

                    // Resolve delivery target label for console output and Slack messages
                    switch (params.DELIVERY_MODE) {
                        case 's3_test':
                            env.DELIVERY_TARGET = "S3 TEST bucket → ${S3_TEST_BUCKET}"
                            echo "📦 Delivery target: ${env.DELIVERY_TARGET}"
                            break
                        case 's3_production':
                            env.DELIVERY_TARGET = "S3 PRODUCTION bucket → ${S3_PROD_BUCKET}"
                            echo "🚨 Delivery target: ${env.DELIVERY_TARGET}"
                            break
                        case 'sftp':
                            env.DELIVERY_TARGET = "SFTP → ${params.SFTP_SERVER}:${params.SFTP_PORT}/${params.SFTP_DIR}"
                            echo "📡 Delivery target: ${env.DELIVERY_TARGET}"
                            break
                    }

                    env.ISRC_COUNT = sh(script: "wc -l < ${env.WORKSPACE}/isrcs.txt", returnStdout: true).trim()
                    echo "📋 ISRCs to process: ${env.ISRC_COUNT}"
                }
            }
        }

        stage('Run Meta Force Takedown') {
            steps {
                script {
                    // Build run args based on delivery mode
                    def runArgs = "--batch-size ${params.BATCH_SIZE} --sleep ${params.SLEEP_SECONDS}"

                    switch (params.DELIVERY_MODE) {
                        case 's3_test':
                            runArgs += " --send-to-s3 True --s3-test True"
                            break
                        case 's3_production':
                            // WORKAROUND: run.py uses argparse type=bool, which means
                            // bool("False") evaluates to True in Python (any non-empty string is truthy).
                            // Passing an empty string "" is the only way to get bool("") = False.
                            // TODO: Fix run.py to use action='store_true' / BooleanOptionalAction,
                            //       then replace this with: --send-to-s3 --no-s3-test
                            runArgs += " --send-to-s3 True --s3-test \"\""
                            break
                        case 'sftp':
                            runArgs += " --secret-arn ${params.SECRET_ARN}"
                            runArgs += " --sftp-server ${params.SFTP_SERVER}"
                            runArgs += " --sftp-user ${params.SFTP_USER}"
                            runArgs += " --sftp-port ${params.SFTP_PORT}"
                            runArgs += " --sftp-dir ${params.SFTP_DIR}"
                            break
                    }

                    if (params.SINCE?.trim()) {
                        runArgs += " --since ${params.SINCE}"
                    }

                    def volumeArg = "--volume ${env.WORKSPACE}/isrcs.txt:/app/isrcs.txt:ro"

                    withEcr {
                        withAWS(
                            roleAccount: AWS_ACCOUNT_ID,
                            role: AWS_ASSUME_ROLE,
                            roleSessionName: env.BUILD_TAG,
                            region: 'us-east-1',
                            useNode: true
                        ) {
                            dir('meta-force-takedown-via-srr') {
                                sh """
                                    docker compose run --rm --build \
                                        -e AWS_ACCESS_KEY_ID \
                                        -e AWS_SECRET_ACCESS_KEY \
                                        -e AWS_SESSION_TOKEN \
                                        -e AWS_REGION \
                                        -e AWS_DEFAULT_REGION \
                                        ${volumeArg} \
                                        meta-force-takedown-via-srr \
                                        /app/isrcs.txt ${runArgs}
                                """
                            }
                        }
                    }
                }
            }
        }
    }

    post {
        success {
            script {
                slackNotify channel: SLACK_NOTIFICATIONS_CHANNEL, message: "✅ Meta force takedown (Build #${env.BUILD_NUMBER}) completed successfully.\n📍 Destination: ${env.DELIVERY_TARGET}\n📋 ISRCs processed: ${env.ISRC_COUNT}"
            }
        }
        failure {
            script {
                slackNotify channel: SLACK_NOTIFICATIONS_CHANNEL, message: "❌ Meta force takedown (Build #${env.BUILD_NUMBER}) failed.\n📍 Destination: ${env.DELIVERY_TARGET}\n📋 ISRCs attempted: ${env.ISRC_COUNT}"
            }
        }
        cleanup {
            cleanWs()
        }
    }
}
