import groovy.transform.Field
import com.sonymusic.Utils

@Field DEFAULT_IMAGE_REPO = '086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-parent-images'

def escapeEnvValue(value) {
    if (value == null) {
        return ''
    }
    def valueStr = String.valueOf(value)
    if (valueStr.startsWith('$')) {
        return value
    }
    if (valueStr.startsWith("'") && valueStr.endsWith("'") || valueStr.startsWith('"') && valueStr.endsWith('"')) {
        // Already quoted: return as is
        return valueStr
    } else {
        return "'${valueStr.replace("'", "'\"'\"'")}'"
    }
}

def call(Map args) {
    def params = Utils.validateParams('dockerRun', args, [
        script: [type: String, required: true],
        imageTag: [type: String, required: true],
        imageRepo: [type: String, required: false, defaultValue: DEFAULT_IMAGE_REPO],
        envVars: [type: Map, required: false, defaultValue: [:]],
        workdir: [type: String, required: false],
        user: [type: String, required: false],
        volumes: [type: List, itemType: String, required: false, defaultValue: []],
    ])

    def dockerRunArgs = [
        '--entrypoint=""',
        '--pull=always'
    ]

    // Include jenkins env vars so the scripts in the container can detect a CI environment.
    def ciEnvVars = [
        JENKINS_URL: env.JENKINS_URL,
        BUILD_ID: env.BUILD_ID,
        CHANGE_ID: env.CHANGE_ID
    ]

    def envVars = ciEnvVars + params.envVars
    
    if(params.workdir)
        dockerRunArgs.add("--workdir ${params.workdir}")

    if(params.user)
        dockerRunArgs.add("--user ${params.user}")

    envVars.each {
        dockerRunArgs.add("--env ${it.key}=${escapeEnvValue(it.value)}")
    }
    
    params.volumes.each {
        dockerRunArgs.add("--volume ${it}")
    }

    withEcr {
        sh """
            docker run ${dockerRunArgs.join(' ')} ${params.imageRepo}:${params.imageTag} /bin/bash -c "${params.script}"
        """
    }
}
