string GITHUB_REPOSITORY = 'cucumber-cypress-tests'
string ECR_ACCOUNT_ID = '086679231553'
List<String> AWS_REGIONS = ['us-east-1']
def qa_task_details

pipeline {
    agent any

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

    parameters {
        string(name: 'SHARED_LIBRARIES_VERSION', defaultValue: 'master', description: 'The version of the Jenkins shared libraries to use. Can be a branch, tag or Git revision.')
    }

    triggers {
        issueCommentTrigger('.*retest this please.*|.*deploy to qa.*')
    }

    stages {
         stage('Load Shared Libraries') {
                steps {
                    library "jenkins-global-libraries@${params.SHARED_LIBRARIES_VERSION}"
                }
            }
         stage('Lint and Test') {
                steps {
                    withEcr {
                        script {
                          def modifiedPaths = getModifiedPaths(
                          paths: 'framework')
                          def modifiedPackagesList = getModifiedPaths(
                            paths: ['framework/package.json', 'framework/yarn.lock']
                          )
                          boolean modifiedPackages = modifiedPackagesList.size() > 0
                         if (modifiedPaths.size() > 0) {
                              sh "make jenkins_pre_commit UNIT_TEST=true MODIFIED_PACKAGES=${modifiedPackages}"
                          } else {
                              sh "make jenkins_pre_commit UNIT_TEST=false MODIFIED_PACKAGES=${modifiedPackages}"
                          }
                        }
                    }
                }
         }
        stage('Validate Software Catalog Definition') {
            steps {
                datadogSoftwareCatalogValidate()
            }
        }
        stage('Build QA docker images in parallel'){
          when {
            anyOf {
                branch 'master'
                expression {
                    return env.GITHUB_COMMENT?.contains('jenkins deploy to qa')
                }
            }
          }
          parallel {
              stage('Create a QA Jenkins release') {
                steps {
                    dockerToEcr awsRegions: AWS_REGIONS, ecrAccountId: ECR_ACCOUNT_ID, imageName: 'qa-cucumber-cypress-tests-jenkins', imageTag: env.GIT_COMMIT, dockerBuildTarget: 'jenkins',
                        dockerBuildCacheDisabled: false
                    }
               }
                stage('Create a QA Fargate release') {
                  steps {
                  dockerToEcr awsRegions: AWS_REGIONS, ecrAccountId: ECR_ACCOUNT_ID, imageName: 'cucumber-cypress-tests', imageTag: env.GIT_COMMIT, dockerBuildTarget: 'fargate',
                    dockerBuildCacheDisabled: false
                    }
              }
          }
        }
        stage('Deploy QA Container to Fargate') {
            when {
                anyOf {
                    branch 'master'
                    expression {
                        return env.GITHUB_COMMENT?.contains('jenkins deploy to qa')
                    }
                }
            }
            steps {
                script {
                    qa_task_details = fargateDeploy environment: 'qa', awsRegions: AWS_REGIONS, gitCommit: env.GIT_COMMIT, serviceName: GITHUB_REPOSITORY,
                                      ecrRegistryAccountId: ECR_ACCOUNT_ID, deployType: 'CREATE_TASK_DEFINITION'
                }
            }
            post {
                success {
                    script {
                        if (env.GITHUB_COMMENT?.contains('jenkins deploy to qa')) {
                            githubPostPrComment(repo: GITHUB_REPOSITORY, message: 'Build deployed to QA environment, task revision number: ' + qa_task_details.revision)
                        }
                    }
                }
            }
        }
        stage('Run E2E tests') {
            when {
                expression {
                    return env.GITHUB_COMMENT?.contains('and run @')
                }
            }
            steps {
                script {
                def tags = ''
                    if (env.GITHUB_COMMENT =~ /.*and run (@.*)/) {
                        tags = (env.GITHUB_COMMENT =~ /.*and run (@.*)/)[0][1]
                        echo "tags: ${tags}"
                    } else {
                        error("Failed to extract tags from PR comment")
                    }
                    e2eTests tags: tags, frameworkEnvironment: 'qa', branchName: env.GIT_BRANCH, envVars: [
                        'TASK_REVISION': qa_task_details.revision
                    ]
                }
            }
        }
        stage('Run QA framework tests') {
            when {
                branch 'master'
            }
            environment {
                TAGS = "@framework_test"
            }
            steps {
                e2eTests tags: env.TAGS, frameworkEnvironment: 'qa'
            }
        }
        stage('Deploy to Prod') {
            when {
                    branch 'master'
                  }
            parallel {
                 stage('Create a Prod Jenkins release') {
                    steps {
                        dockerToEcr awsRegions: AWS_REGIONS, ecrAccountId: ECR_ACCOUNT_ID, imageName: 'prod-cucumber-cypress-tests-jenkins', imageTag: env.GIT_COMMIT, dockerBuildTarget: 'jenkins',
                            dockerBuildCacheDisabled: false
                    }
                 }
                stage('Deploy Prod Container to Fargate') {
                    steps {
                        fargateDeploy environment: 'prod', awsRegions: AWS_REGIONS, gitCommit: env.GIT_COMMIT, serviceName: GITHUB_REPOSITORY,
                            ecrRegistryAccountId: ECR_ACCOUNT_ID, deployType: 'CREATE_TASK_DEFINITION'
                    }
                }
            }
            post {
                success {
                    datadogSoftwareCatalogPublish()
                }
            }
        }
    }
    post {
        failure {
            script {
                slackSend (
                    color: "danger",
                    channel: "#cypress-test-e2e-results",
                    message: """Cypress Cucumber Tests Pipeline failed! ${env.JOB_NAME} - #${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"""
                )
            }
        }
    }
}
