pipeline {
    agent any
    stages {
        stage('Get Git Commit') {
            steps {
                script {
                    checkout([
                        $class: 'GitSCM',
                        branches: [[name: '*/master']],
                        doGenerateSubmoduleConfigurations: false,
                        extensions: [],
                        submoduleCfg: [],
                        userRemoteConfigs: [
                            [
                                credentialsId: '577cbc72-7d9e-4eba-924c-ecbbe6de9805',
                                url: 'git@github.com:theorchard/graphql-solfege.git'
                            ]
                        ]
                    ])
                    GIT_COMMIT = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
                }
            }
        }

        stage('Unit tests and Style Checks') {
            steps {
                build job: 'graphql-solfege-unit-lint',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ]
                ]
            }
        }

        stage('Create a release') {
            steps {
                build job: 'graphql-solfege-docker-to-ecr',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ]
                ]
            }
        }

        stage('Validate QA schema') {
            when {
                expression {
                    params.VALIDATE_SCHEMA == true
                }
            }
            steps {
                build job: 'graphql-solfege-validate-schema',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "qa"
                    ]
                ]
            }
        }

        stage('Deploying to QA') {
            steps {
                build job: 'graphql-solfege-docker-fargate-deploy',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "qa"
                    ]
                ]
            }
        }

        stage('Push QA schema') {
            steps {
                build job: 'graphql-solfege-push-schema',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "qa"
                    ]
                ]
            }
        }

        stage('Integration Tests') {
            steps {
                script {
                    try {
                        echo "Testing the version against integration tests... ${GIT_COMMIT}"
                        sleep(10)
                        build job: 'graphql-solfege-integration-tests'
                    } catch(error) {
                        echo "First build failed, let's retry..."
                        retry(1) {
                            sleep(10)
                            build job: 'graphql-solfege-integration-tests'
                        }
                    }
                }
            }
        }

        stage('E2E Tests') {
            steps {
                echo "Testing the version against end-to-end tests... ${GIT_COMMIT}"
                build job: 'graphql-solfege-e2e-cucumber-tests'
            }
        }

        stage('Validate Prod schema') {
            when {
                expression {
                    params.VALIDATE_SCHEMA == true
                }
            }
            steps {
                build job: 'graphql-solfege-validate-schema',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "prod"
                    ]
                ]
            }
        }

        stage('Deploy to Prod') {
            steps {
                build job: 'graphql-solfege-docker-fargate-deploy',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "prod"
                    ]
                ]
            }
        }

        stage('Push Prod schema') {
            steps {
                build job: 'graphql-solfege-push-schema',
                parameters: [
                    [
                        $class: 'StringParameterValue',
                        name: 'GIT_COMMIT',
                        value: GIT_COMMIT
                    ],
                    [
                        $class: 'StringParameterValue',
                        name: 'ENV',
                        value: "prod"
                    ]
                ]
            }
        }
    }
}
