pipeline{
    agent any
    tools {
		nodejs 'NodeJS_20.14.0'
    }
    environment{
        ORG_NAME = "userinsighttracking"
        GITLEAKS='/var/lib/jenkins/external_tools/gitleaks/8.18.0'
        GIT_COMMIT_SHORT = sh(
                script: "printf \$(git rev-parse --short ${GIT_COMMIT})",
                returnStdout: true
        )
        AWS_EIP = '43.204.68.17'
        USER = 'ec2-user'
        ENV_NAME = getEnvName(env.BRANCH_NAME)
		ENVNAME = get_EnvName(env.BRANCH_NAME)
    }
    options {
		buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5', daysToKeepStr: '15'))
	}
    stages{
        stage("VERSION"){
            steps{
                buildDescription "$BUILD_NUMBER - $GIT_COMMIT_SHORT"
            }
        }
        stage("SecretScanning"){
            steps{
                sh '''
                    $GITLEAKS/gitleaks detect -v --no-git
                '''
            }
        }
        stage("updateConfig"){
            steps{
                configFileProvider([configFile(fileId: "$ORG_NAME-$ENV_NAME-config", targetLocation: ".env")]) {

                }
            }
        }
        stage('NPM Install'){
			steps{
                sh """
                #chmod 644 .env

	
  		          export npm_config_cache=$WORKSPACE/.npm-cache
                export NODE_OPTIONS=--max_old_space_size=8192
                npm cache clean --force
                npm install --force
                """
			}
		}
        stage('NPM Build'){
			steps{
                sh """
                CI=false npm run build
                """
			}
		}
        stage('NPM Test'){
			steps{
                sh """
                CI=true npm run test
                """
			}
		}
        // stage("SonarAnalysis"){
        //     steps {
        //         script {
        //         // def scannerHome = tool 'sonarqube-scanner';
        //             withSonarQubeEnv("sonarqube-server") {
        //                 sh "${tool("sonarqube-scanner")}/bin/sonar-scanner \
        //                 -Dsonar.projectKey=${ORG_NAME}-${ENV_NAME}-UI \
        //                 -Dsonar.projectName=${ORG_NAME}-${ENV_NAME}-UI \
        //                 -Dsonar.projectVersion=$GIT_COMMIT_SHORT \
        //                 -Dsonar.sources=. \
        //                 -Dsonar.sonar.nodejs.executable=. \
        //                 -Dsonar.language=. \
        //                 -Dsonar.exclusions=src/**/*test.js \
        //                 -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info"
        //             }
        //         }
        //     }
        // }
		stage("SonarAnalysis"){
            steps {
                script {
                // def scannerHome = tool 'sonarqube-scanner';
                    withSonarQubeEnv("sonarqube") {
                        sh "${tool("sonarqube-scanner")}/bin/sonar-scanner \
                        -Dsonar.projectKey=cd-${ENVNAME}-computrace-${ORG_NAME}-${ENV_NAME}-compunnel-com-ui-aws \
                        -Dsonar.projectName=cd-${ENVNAME}-computrace-${ORG_NAME}-${ENV_NAME}-compunnel-com-ui-aws \
                        -Dsonar.projectVersion=$GIT_COMMIT_SHORT \
                        -Dsonar.sources=. \
                        -Dsonar.sonar.nodejs.executable=. \
                        -Dsonar.language=. \
                        -Dsonar.exclusions=src/**/*test.js,CreateEditRole.test.js,webpack.config.mjs,jest.config.mjs \
                        -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info"
                    }
                }
            }
        }
        stage('SonarStatus') {
          steps {
                timeout(time: 1, unit: 'HOURS') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
        stage("Build"){
            steps{
                sh '''
                    docker build -t $ORG_NAME-$ENV_NAME-ui .
                    docker tag $ORG_NAME-$ENV_NAME-ui:latest 801857237392.dkr.ecr.ap-south-1.amazonaws.com/$ORG_NAME-$ENV_NAME-ui:${GIT_COMMIT_SHORT}
                '''
            }
        }
        stage("Push DEV") {
            when{
                expression { BRANCH_NAME == 'development' }
            }
            steps {
                script {
                    withAWS(credentials:'UserInsightTrackingIAM') {
                        sh "aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 801857237392.dkr.ecr.ap-south-1.amazonaws.com"
                        sh "docker push 801857237392.dkr.ecr.ap-south-1.amazonaws.com/userinsighttracking-dev-ui:${GIT_COMMIT_SHORT}"
                    }
                }
            }
        }
        stage("Push QA") {
            when{
                expression { BRANCH_NAME == 'pre-production' }
            }
            steps {
                script {
                    withAWS(credentials:'UserInsightTrackingIAM') {
                        sh "aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 801857237392.dkr.ecr.ap-south-1.amazonaws.com"
                        sh "docker push 801857237392.dkr.ecr.ap-south-1.amazonaws.com/userinsighttracking-qa-ui:${GIT_COMMIT_SHORT}"
                    }
                }
            }
        }
        stage("Push UAT") {
            when{
                expression { BRANCH_NAME == 'main' }
            }
            steps {
                script {
                    withAWS(credentials:'UserInsightTrackingIAM') {
                        sh "aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 801857237392.dkr.ecr.ap-south-1.amazonaws.com"
                        sh "docker push 801857237392.dkr.ecr.ap-south-1.amazonaws.com/userinsighttracking-uat-ui:${GIT_COMMIT_SHORT}"
                    }
                }
            }
        }
        stage("RELEASE_TAG"){
            when { 
                environment name: 'ENV_NAME', value: 'uat' 
            }
            steps{
                sh """
                    git tag -a $GIT_COMMIT_SHORT -m 'Release version - $GIT_COMMIT_SHORT'
                    git push git@github.com:CD-Internal-Projects/User-Insight-Tracking-UI.git $GIT_COMMIT_SHORT
                """
            }
        }
        stage('Deploy development') {
            when {
                expression { BRANCH_NAME == 'development' }
            }
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: "computrace-qa-ssh", keyFileVariable: 'keyfile')]) {
                    sh """
                    sed -i 's/__TAG__/${GIT_COMMIT_SHORT}/g' docker-compose-ui.yml
                    scp -i ${keyfile} docker-compose-ui.yml ${USER}@${AWS_EIP}:/var/www/html/UserInsightTracking-dev/
                    ssh -i ${keyfile} ${USER}@${AWS_EIP} "cd /var/www/html/UserInsightTracking-dev; \
                    aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 801857237392.dkr.ecr.ap-south-1.amazonaws.com; \
                    docker-compose --project-name userinsighttracking-dev -f docker-compose-ui.yml up -d; \
                    sudo service nginx reload; \
                    docker logout 801857237392.dkr.ecr.ap-south-1.amazonaws.com;"
                    """
                }
            }
        }
        stage('Deploy pre-production') {
            when {
                expression { BRANCH_NAME == 'pre-production' }
            }
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: "computrace-qa-ssh", keyFileVariable: 'keyfile')]) {
                    sh """
                    sed -i 's/__TAG__/${GIT_COMMIT_SHORT}/g' docker-compose-qa-ui.yml
                    scp -i ${keyfile} docker-compose-qa-ui.yml ${USER}@${AWS_EIP}:/var/www/html/UserInsightTracking-qa/
                    ssh -i ${keyfile} ${USER}@${AWS_EIP} "cd /var/www/html/UserInsightTracking-qa; \
                    aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 801857237392.dkr.ecr.ap-south-1.amazonaws.com; \
                    docker-compose --project-name userinsighttracking-qa -f docker-compose-qa-ui.yml up -d; \
                    sudo service nginx reload; \
                    docker logout 801857237392.dkr.ecr.ap-south-1.amazonaws.com;"
                    """
                }
            }
        }
        // stage("RELEASE_TAG"){
        //     when { 
        //         environment name: 'ENV_NAME', value: 'main' 
        //     }
        //     steps{
        //         sh """
        //             git tag -a $GIT_COMMIT_SHORT -m 'Release version - $GIT_COMMIT_SHORT'
        //             git push git@github.com:CD-Internal-Projects/User-Insight-Tracking-UI.git $GIT_COMMIT_SHORT
        //         """
        //     }
        // }
        stage("cleanup"){
            steps{
                sh '''
                    docker rmi -f $ORG_NAME-$ENV_NAME-ui:latest
                    docker rmi -f 801857237392.dkr.ecr.ap-south-1.amazonaws.com/$ORG_NAME-$ENV_NAME-ui:${GIT_COMMIT_SHORT}
                '''
            }
        }
    }
    post {
       always { 
            cleanWs()
        }
    }
}
def get_EnvName(branchName) {
    if("main".equals(branchName)) {
        return "u";
    } else if ("pre-production".equals(branchName)) {
        return "q";
    } else {
        return "d";
    }
}

def getEnvName(branchName) {
    if("main".equals(branchName)) {
        return "uat";
    } else if ("pre-production".equals(branchName)) {
        return "qa";
    } else {
        return "dev";
    }
}
