node ('aws') {
    // Prepare build params for chosen environment
    def params_list = params["${ENVIRONMENT}_PARAMS"].split("\n")
    def build_params = [:]
    for (p in params_list ) {
        def (key, value) = p.split("=")
        build_params[key] = value
    }

    def today = new Date().format("yyyy-MM-dd")
    def today_underscore = new Date().format("yyyy_MM_dd")
    def s3_path = "${build_params.S3_DIRECTORY}/${today}_${UPSTREAM_BUILD_ID}"

    def target_active_s3_location = "s3://${build_params.S3_BUCKET}/${s3_path}/data/active/"
    def target_audit_s3_location = "s3://${build_params.S3_BUCKET}/${s3_path}/data/audit/"

    def import_period = 1
    def prev_date = new Date().minus(import_period).format("yyyy_MM_dd")

    stage('Prepare') {
        checkout scm
    }
    try {
        stage('Toggle MR Maintenance') {
            echo 'Toggle MasterRegistry Maintenance state'
            sh 'python3 -m venv maintenance_env'
            sh 'maintenance_env/bin/pip install -r maintenance/requirements.txt'
            sh "maintenance_env/bin/python maintenance/toggle_maintenance.py start -h ${build_params.MEMCACHED_HOST} -p ${build_params.MEMCACHED_PORT}"
        }
        stage('Prepare Snowflake import script for MR_ACTIVE') {
            sh "cp snowflake_queries/${build_params.SNOWFLAKE_ACTIVE_IMPORT_SCRIPT} snowflake_queries/${build_params.SNOWFLAKE_ACTIVE_IMPORT_SCRIPT}.shadow"
            withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: build_params.AWS_ACCESS_KEY_ID]]) {
                sh """sed -e "s|\\[snowflake_db]|${build_params.SNOWFLAKE_DB}|" \\
                    -e "s|\\[snowflake_schema]|${build_params.SNOWFLAKE_SCHEMA}|" \\
                    -e "s|\\[snowflake_warehouse]|${build_params.SNOWFLAKE_WAREHOUSE}|" \\
                    -e "s|\\[aws_access_key_id]|${AWS_ACCESS_KEY_ID}|" \\
                    -e "s|\\[aws_secret_access_key]|${AWS_SECRET_ACCESS_KEY}|" \\
                    -e "s|\\[target_s3_location]|${target_active_s3_location}|" \\
                    -e "s|\\[today]|${today_underscore}|" \\
                    -e "s|\\[prev_date]|${prev_date}|" \\
                    snowflake_queries/${build_params.SNOWFLAKE_ACTIVE_IMPORT_SCRIPT}.shadow > snowflake_queries/${build_params.SNOWFLAKE_ACTIVE_IMPORT_SCRIPT}"""
            }
        }
        stage('Run Snowflake import script for MR_ACTIVE') {
            echo "Importing MR_ACTIVE data to Snowflake."
            withCredentials([usernamePassword(credentialsId: build_params.SNOWFLAKE_CREDS, usernameVariable: 'SNOWSQL_USER', passwordVariable: 'SNOWSQL_PWD')]) {
                sh "snowsql --upgrade --single-transaction -o exit_on_error=${build_params.SNOWFLAKE_EXIT_ON_ERROR} -o log_level=${build_params.SNOWFLAKE_LOG_LEVEL} -a ${build_params.SNOWFLAKE_ACCOUNT} -w ${build_params.SNOWFLAKE_WAREHOUSE} -f snowflake_queries/${build_params.SNOWFLAKE_ACTIVE_IMPORT_SCRIPT}"
            }
        }
        stage('Prepare Snowflake import script for MR_AUDIT') {
            sh "cp snowflake_queries/${build_params.SNOWFLAKE_AUDIT_IMPORT_SCRIPT} snowflake_queries/${build_params.SNOWFLAKE_AUDIT_IMPORT_SCRIPT}.shadow"
            withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: build_params.AWS_ACCESS_KEY_ID]]) {
                sh """sed -e "s|\\[snowflake_db]|${build_params.SNOWFLAKE_DB}|" \\
                    -e "s|\\[snowflake_schema]|${build_params.SNOWFLAKE_SCHEMA}|" \\
                    -e "s|\\[snowflake_warehouse]|${build_params.SNOWFLAKE_WAREHOUSE}|" \\
                    -e "s|\\[aws_access_key_id]|${AWS_ACCESS_KEY_ID}|" \\
                    -e "s|\\[aws_secret_access_key]|${AWS_SECRET_ACCESS_KEY}|" \\
                    -e "s|\\[target_s3_location]|${target_audit_s3_location}|" \\
                    -e "s|\\[today]|${today_underscore}|" \\
                    -e "s|\\[prev_date]|${prev_date}|" \\
                    snowflake_queries/${build_params.SNOWFLAKE_AUDIT_IMPORT_SCRIPT}.shadow > snowflake_queries/${build_params.SNOWFLAKE_AUDIT_IMPORT_SCRIPT}"""
            }
        }
        stage('Run Snowflake import for MR_AUDIT') {
            echo "Importing MR_AUDIT data to Snowflake."
            withCredentials([usernamePassword(credentialsId: build_params.SNOWFLAKE_CREDS, usernameVariable: 'SNOWSQL_USER', passwordVariable: 'SNOWSQL_PWD')]) {
                sh "snowsql --upgrade --single-transaction -o exit_on_error=${build_params.SNOWFLAKE_EXIT_ON_ERROR} -o log_level=${build_params.SNOWFLAKE_LOG_LEVEL} -a ${build_params.SNOWFLAKE_ACCOUNT} -w ${build_params.SNOWFLAKE_WAREHOUSE} -f snowflake_queries/${build_params.SNOWFLAKE_AUDIT_IMPORT_SCRIPT}"
            }
        }
    }
    catch(err) {
        print err
        currentBuild.result = 'FAILURE'
    }
    finally {
        stage('Toggle MR Maintenance') {
            sh "maintenance_env/bin/python maintenance/toggle_maintenance.py stop -h ${build_params.MEMCACHED_HOST} -p ${build_params.MEMCACHED_PORT}"
        }
        stage('Cleanup') {
            deleteDir()
        }
    }
}
