import hudson.Util
import com.sonymusic.*

def call(Map args) {
    def params = Utils.validateParams('e2eTests', args, [
        checkoutSubDir: [type: String, required: false, defaultValue: 'default'],
        frameworkEnvironment: [type: String, required: false, defaultValue: 'prod'],
        branchName: [type: String, required: false, defaultValue: '*/master'],
        githubUser: [type: String, required: false, defaultValue: 'theorchard'],
        rerunFargate: [type: Boolean, required: false, defaultValue: false],
        reportTitle: [type: String, required: false, defaultValue: 'QA'],
        makeTarget: [type: String, required: false, defaultValue: 'cypress_run_parallel'],
        tags: [type: String, required: true],
        configFile: [type: String, required: false, defaultValue: 'qa'],
        envVars: [type: Map, required: false],
    ])

    dir("cucumber-cypress-tests/${params.checkoutSubDir}") {
        if (params.branchName =~ /PR-\d+/) {
            def prNumber = (env.GIT_BRANCH =~ /PR-(\d+)/)[0][1]
            checkout([$class: 'GitSCM', branches: [[name: "FETCH_HEAD"]], extensions: [[$class: 'LocalBranch']], userRemoteConfigs: [[refspec: "+refs/pull/${prNumber}/head:refs/remotes/origin/PR-${prNumber}", url: "git@github.com:${params.githubUser}/cucumber-cypress-tests.git"]]])
        } else {
            checkout([$class: 'GitSCM', branches: [[name: params.branchName]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '577cbc72-7d9e-4eba-924c-ecbbe6de9805', url: "git@github.com:${params.githubUser}/cucumber-cypress-tests.git"]]])
        }

        def credentials = [
            aws(credentialsId: 'cucumber-tests'),
            string(credentialsId: 'packagecloud_repo_token', variable: 'PACKAGECLOUD_TOKEN'),
            string(credentialsId: 'github_packages_token', variable: 'GITHUB_TOKEN')
        ]
        def envVariables = ''
        params.envVars.each {
            envVariables = envVariables + "${it.key}=${it.value} "
        }
        def finalTags = "${params.tags}"
        def setupMakeCommand = params.envVars?.get('setupMakeCommand')
        
        withCredentials(credentials) {
            ansiColor('xterm') {
                try {
                    if (setupMakeCommand) {
                        sh "./frameworkRunner.sh make ${setupMakeCommand}"
                    }

                    sh """
                        #!/bin/bash -lxe
                        export ENV=${params.frameworkEnvironment}
                        ./frameworkRunner.sh make ${params.makeTarget} TAGS='${finalTags}' JOB_NAME=${env.JOB_NAME} BUILD_ID=${env.BUILD_ID} CONFIG_FILE=${params.configFile} REPORT_TITLE='${params.reportTitle}' RERUN_FARGATE='${params.rerunFargate}' ${envVariables}
                    """
                }
                finally {
                    sh """
                        #!/bin/bash -lxe
                        make clean_docker_containers
                    """
                    cucumber(
                        fileIncludePattern: "**/*.json",
                        jsonReportDirectory: 'cypress/results/',
                        reportTitle: params.reportTitle
                    )
                }
            }
        }
    }
}
