
def APP_NAME = 'frontend-account360'
def QA_AUTH0_CLIENT_ID = 'z0hQp7FQ6PK5xwnt0NHb3pQ1JqKpXCvU'
def PROD_AUTH0_CLIENT_ID = 'gAIM7q23w9KhAIJfOgN5fitWTJ0uFXFD'
def SLACK_NOTIFY_CHANNEL = "#accounts-team-alerts"
def POEDITOR_PROJECT_ID='752224'

QA_GRAPHQL_URL='https://qa-ows-grass.theorchard.io/graphql-router/graphql'
PROD_GRAPHQL_URL='https://prod-ows-grass.theorchard.io/graphql-router/graphql'


pipeline {
    agent {
        label 'aws'
    }

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

    parameters {
        choice(name: 'DEPLOY_TO_PROD', choices: ['Yes', 'No'], description: 'Whether or not to deploy to prod.')
        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 pri.*')
    }

    stages {
        stage('Load Shared Libraries') {
            steps {
                library "jenkins-global-libraries@${params.SHARED_LIBRARIES_VERSION}"
            }
        }
        stage('Compliance Checks') {
            steps {
                complianceChecks()
            }
        }
        stage('Validate Software Catalog Definition') {
            steps {
                datadogSoftwareCatalogValidate()
            }
        }
        stage('Unit Tests and Style Checks') {
            when {
                not {
                    environment name: 'GITHUB_COMMENT', value: 'deploy pri'
                }
            }
            steps {
                yarnRun(scriptNames: ['test'])
            }
        }
        stage('Static Application Security Tests') {
            steps {
                sastTests()
            }
        }
        stage('Deploy to PR Instance') {
            when {
                environment name: 'GITHUB_COMMENT', value: 'deploy pri'
            }
            steps {
                suiteAppDeployPrInstance (
                    appName: APP_NAME,
                    envVars: [
                        AUTH0_CLIENT_ID: QA_AUTH0_CLIENT_ID,
                    ]
                )
            }
        }
        stage('Sonar Scan and Analysis') {
            when {
                branch 'master'
            }
            steps {
                script {
                    echo "Running Sonar scan for ${APP_NAME}"
                    sonarScan project: APP_NAME, language: 'ts'
                }
            }
        }
        stage('Deploy to QA') {
            when {
                branch 'master'
            }
            steps {
                suiteAppBuild (
                    env: 'qa',
                    envVars: [
                        AUTH0_CLIENT_ID: QA_AUTH0_CLIENT_ID,
                        AUTH0_STORE_TOKEN_IN_CLIENT: 'true',
                        GRAPHQL_URL: QA_GRAPHQL_URL,
                        DATADOG_APPLICATION_ID: '8f6869f2-57e0-4707-becc-9f916b3015be',
                        DATADOG_CLIENT_TOKEN: 'pubba57ebdca5769e866f95af4628f2c35a',
                        POEDITOR_PROJECT_ID: POEDITOR_PROJECT_ID,
                        SEGMENT_WRITE_KEY: 'CA10lofmi1YOUR7VJnDXSFvK1EzA21n5',
                        SENTRY_DSN: 'https://f4f7ffc178d3727ad56c925aa3370cae@o22178.ingest.us.sentry.io/4507843729883136',
                    ]
                )

                suiteAppPublish (
                    env: "qa",
                    appName: APP_NAME
                )
            }
        }
        stage('Invalidate QA CDN') {
            when {
                branch 'master'
            }
            steps {
                cdnInvalidate(
                    env: 'qa',
                    appName: APP_NAME
                )
            }
        }
        stage('Deploy to Prod'){
            when {
                allOf {
                    branch 'master'
                    expression { params.DEPLOY_TO_PROD == 'Yes' }
                }
            }
            steps {
                suiteAppBuild (
                    env: 'prod',
                    envVars: [
                        AUTH0_CLIENT_ID: PROD_AUTH0_CLIENT_ID,
                        AUTH0_STORE_TOKEN_IN_CLIENT: 'true',
                        GRAPHQL_URL: PROD_GRAPHQL_URL,
                        DATADOG_APPLICATION_ID: '8f6869f2-57e0-4707-becc-9f916b3015be',
                        DATADOG_CLIENT_TOKEN: 'pubba57ebdca5769e866f95af4628f2c35a',
                        POEDITOR_PROJECT_ID: POEDITOR_PROJECT_ID,
                        SEGMENT_WRITE_KEY: 'Bowy3WWayNb31gAr3fYDGzTByQ69CQuF',
                        SENTRY_DSN: 'https://24b7d41b1830be0852542f7e9d962f1d@o22178.ingest.us.sentry.io/4507849587949568',
                    ]
                )
                suiteAppPublish (
                    env: "prod",
                    appName: APP_NAME
                )
            }
        }
        stage('Invalidate Prod CDN') {
            when {
                allOf {
                    branch 'master'
                    expression { params.DEPLOY_TO_PROD == 'Yes' }
                }
            }
            steps {
                cdnInvalidate(
                    env: 'prod',
                    appName: APP_NAME
                )
            }
        }
        stage('Publish Software Catalog') {
            when {
                allOf {
                    branch 'master'
                }
            }
            steps {
                datadogSoftwareCatalogPublish()
            }
        }
    }
    post {
        always {
            script {
                if (env.BRANCH_NAME == 'master') {
                    slackNotify channel: SLACK_NOTIFY_CHANNEL
                }
            }
        }
        cleanup {
            cleanWs()
        }
    }
}
