@Library('nf-jenkins-shared-libraries')_

def changedProjects = ["cloud-provider-model", "cloud-provider-sdk", "cloud-provider-service-base", "cloud-provider-services"]

REPO = "cloud-provider-services"
MVN_HOME='mvn_local_repository'
JAVA_HOME='/opt/java/openjdk'

channel = "pr-builds"

kibana_url = ""
smoketest_url = ""
artifact_link = ""
sonar_link = ""
failure_msg = ""
stage_name = ""
link_url = ""

sonar_alert = false
set_kibana_url = false
set_smoketest_url = false
set_artifact_url = false
update_jenkins_build = true

affected_service = null

pipeline {
    agent {
        ecs {
            inheritFrom 'agent-jdk17'
        }
    }

    environment {
        SONAR_CLOUD = credentials('sonar')
        BITBUCKET_AUTH = credentials('bitbucket_auth')
    }

    stages {
        stage('Initialize') {
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    bb_request = readJSON text: bb_request_raw
                    REPO = bb_request.pullrequest.source.repository.full_name.split("/")[1]
                    BB_COMMENTS_URL="${bb_request.pullrequest.links.comments.href}"
                    BB_APPROVE_URL="${bb_request.pullrequest.links.approve.href}"
                    BB_DECLINE_URL="${bb_request.pullrequest.links.decline.href}"
                    BB_BRANCH="${bb_request.pullrequest.source.branch.name}"
                    BB_DESTINATION_BRANCH="${bb_request.pullrequest.destination.branch.name}"
                    COMMIT_HASH = "${bb_request.pullrequest.source.commit.hash}"

                    DESCRIPTION="Branch: ${BB_BRANCH} REPO: ${REPO}"
                    currentBuild.description = "${DESCRIPTION}"
                }
            }
        }

        stage('ChangeSet'){
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    git_diff_serverless(REPO, BB_BRANCH)

                    // Check that destination branch
                    if(BB_DESTINATION_BRANCH != "develop") {
                        failure_msg = "Only builds PR with destination branch as develop"
                        error "${failure_msg}"
                    }
                    bitbucketStatus repo: "${REPO}", BRANCH_NAME: BB_BRANCH, GIT_COMMIT: COMMIT_HASH, status: "INPROGRESS", PR_CHECK: "false", BUILD_NAME: "Jenkins PR Build"
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    sh "mkdir -p ${MVN_HOME}/${BUILD_NUMBER}"
                    dir("${MVN_HOME}/${BUILD_NUMBER}") {
                        sh "for dir in \$(ls \$HOME/.m2/repository/ | grep -v 'io'); do ln -s \$HOME/.m2/repository/\$dir \$dir; done"
                    }
                    configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                        sh "./mvnw -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} clean install"
                    }
                }
            }
        }

        stage('Dependency-Check') {
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    try{
                        configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                            sh "./mvnw -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -Pdependence_check -DskipTests dependency-check:aggregate xml:transform"
                        }
                    }catch(e){
                        echo "Dependency Checks failed with error ${e}"
                        fn_msg = "Dependency Checks failed for branch ${bb_request.pullrequest.source.branch.name}. The build will still continue. Please check link for details."
                        color = "#FF8000"
                        author_email = fetch_author_email("${REPO}", "${COMMIT_HASH}")
                        send_custom_notification("${author_email}", "${REPO}", "${channel}", "${fn_msg}", "${color}", "${link_url}")
                    }
                }
            }  
        }

        stage('Sonar') {
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    sh "./mvnw -T 8 sonar:sonar -DskipTests -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -Dsonar.host.url=https://sonarcloud.io \
                       -Dsonar.organization=netfoundry -Dsonar.projectName=${REPO} -Dsonar.branch.name=${BB_BRANCH} -Dsonar.login=${SONAR_CLOUD_PSW}"
                }
            }
        }

        // keeping this step in case we need to run seperate analysis on sub modules.
        //stage('Sonar') {
        //   steps {
        //        script {
        //            def buildSonar = [:]
        //            for( String sonar: changedProjects) {
        //                def serviceStep = "${sonar}"
        //                buildSonar[serviceStep] = { ->
        //                    dir("${serviceStep}") {
        //                       sh "export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64/; mvn -T 8 sonar:sonar -Dmaven.repo.local=../${MVN_HOME}/${BUILD_NUMBER} -Dsonar.host.url=https://sonarcloud.io "+
        //                        "-Dsonar.organization=netfoundry -Dsonar.projectName=${serviceStep} "+
        //                        "-Dsonar.branch.name=${BB_BRANCH} -Dsonar.login=${SONAR_CLOUD_PSW}"
        //                    }
        //                }
        //            }
        //            parallel buildSonar
        //        }
        //    }
        //}

        stage('JUnit') {
            steps {
                script {
                    stage_name = env.STAGE_NAME
                    junitParse services: [REPO], parallelize: false, dir: "", xml: "target/surefire-reports/*.xml"
                }
            }
        }
    }

    post {
        always {
            sh "rm -rf ${MVN_HOME}/${BUILD_NUMBER}"
        }
        aborted {
            bitbucketStatus repo: REPO, BRANCH_NAME: BB_BRANCH, GIT_COMMIT: COMMIT_HASH, status: "STOPPED", PR_CHECK: "false"
        }
        failure {
            script {
                failure_reason = "${stage_name} stage failed. ${failure_msg}"
                bbReject(bb_request, REPO, BB_BRANCH, COMMIT_HASH, failure_reason, update_jenkins_build, affected_service, set_kibana_url, kibana_url, set_smoketest_url, smoketest_url, set_artifact_url, artifact_link, sonar_alert, sonar_link)
                bitbucketStatus repo: REPO, BRANCH_NAME: BB_BRANCH, GIT_COMMIT: COMMIT_HASH, status: "FAILED", PR_CHECK: "false"
            }
        }
        success {
            script {
                bbApprove(bb_request, REPO, BB_BRANCH, COMMIT_HASH)
                bitbucketStatus repo: REPO, BRANCH_NAME: BB_BRANCH, GIT_COMMIT: COMMIT_HASH, status: "SUCCESSFUL", PR_CHECK: "false"
            }
        }
    }
}