TOP_JOB_DESC = "Builds:\\n"

String buildJob(String ghcontext, String jobName) {
        setGitHubPullRequestStatus(context: ghcontext, message: 'Building', state: 'PENDING')
        
        if (currentBuild.description == null) {
            currentBuild.description = "Builds:<br>"
        }
        currentBuild.displayName = "PR: #${GITHUB_PR_NUMBER} - Build: #${BUILD_NUMBER}"
        def jobBuild = build job: jobName, propagate: false, parameters: [string(name: 'SHA1', value: GITHUB_PR_HEAD_SHA), string(name: 'GITHUB_URL', value: GITHUB_REPO_GIT_URL), string(name: 'GITHUB_PR_NUMBER', value: GITHUB_PR_NUMBER)]
        def jobResult = jobBuild.getResult()
        def jobURL = jobBuild.getAbsoluteUrl()

        echo "Build of '${jobName}' returned result: ${jobResult}"

        if (jobResult == 'SUCCESS') {
            setGitHubPullRequestStatus(context: ghcontext, message: "Success - ${jobURL}", state: jobResult)
        } else {
            setGitHubPullRequestStatus(context: ghcontext, message: "Failure - ${jobURL}", state: jobResult, targetUrl: "${jobURL}")
        }
        currentBuild.description += " ${jobName} - ${jobURL} <br>"
        return jobResult
}

pipeline {
    agent none
    
    stages {
        stage('Quick Checks') {
            parallel {
                stage('Clang-Format') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*clang-format.*/ }
                        }
                    }
                    steps {
                        script {
                            echo GITHUB_PR_COMMENT_BODY_MATCH
                            result = buildJob('Clang-Format', 'Github_Builds/clang-format')
                            if (result == 'FAILURE') {
                                error('Clang-Format failed')
                            }
                        }
                    }
                }
                stage('RAT') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*RAT.*/ }
                        }
                    }
                    steps {
                        script {
                            result = buildJob('RAT', 'Github_Builds/rat')
                            if (result == 'FAILURE') {
                                error('RAT failed')
                            }
                        }
                    }
                }
            }
        }
        
        
        stage('OS Builds') {
            parallel {
                stage('Ubuntu Build') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*ubuntu.*/ }
                        }
                    }
                    steps {
                        script {
                            result = buildJob('Ubuntu', 'Github_Builds/ubuntu')
                            if (result == 'FAILURE') {
                                error('Ubuntu build failed')
                            }
                        }
                    }
                }
                stage('Fedora Build') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*fedora.*/ }
                        }
                    }                    
                    steps {
                        script {
                            result = buildJob('Fedora', 'Github_Builds/fedora')
                            if (result == 'FAILURE') {
                                error('Fedora build failed')
                            }
                        }
                    }
                }
                stage('Debian Build') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*debian.*/ }
                        }
                    }                    
                    steps {
                        script {
                            result = buildJob('Debian', 'Github_Builds/debian')
                            if (result == 'FAILURE') {
                                error('Debian build failed')
                            }
                            result = 'SUCCESS'
                        }
                    }
                }

                stage('CentOS Build') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*centos.*/ }
                        }
                    }                    
                    steps {
                        script {
                            result = buildJob('CentOS', 'Github_Builds/centos')
                            if (result == 'FAILURE') {
                                error('CentOS build failed')
                            }
                        }
                    }
                }
            }
        }
        
        
        stage('Tests') {
            parallel {
                stage('Clang-Analyzer') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*clang-analyzer.*/ }
                        }
                    }                    
                    steps {
                        script {
                            result = buildJob('Clang-Analyzer', 'Github_Builds/clang-analyzer')
                            if (result == 'FAILURE') {
                                error('Clang-Analyzer failed')
                            }
                        }
                    }
                }
                stage('AuTest') {
                    when {
                        anyOf {
                            environment name: 'GITHUB_PR_COMMENT_BODY_MATCH', value: ''
                            expression { GITHUB_PR_COMMENT_BODY_MATCH ==~ /.*autest.*/ }
                        }
                    }
                    steps {
                        script {
                            result = buildJob('AuTest', 'Github_Builds/autest')
                            if (result == 'FAILURE') {
                                error('AuTest failed')
                            }
                        }
                    }
                }
            }
        }
        
    }
}
