pipeline {
    agent any

    tools {
        nodejs 'Node20'
    }

    environment {
        DEV_EMAIL  = "kashyap@moweb.com"
        SERVER_IP  = "91.99.84.37"
        PROJECT_PATH = "/var/www/html/dmc-new/nest-dmc"
        DEPLOY_BRANCH = "development"
    }

    options {
        timestamps()
        disableConcurrentBuilds()
    }

    stages {
        
             /* ---------------- CI ---------------- */

        stage('Node Version Validation') {
            steps {
                sh '''
                    echo "Using Node from: $(which node)"
                    NODE_VERSION=$(node -v)
                    echo "Current Node Version: $NODE_VERSION"

                    # Validate only major version 
                    if ! echo "$NODE_VERSION" | grep -q "^v20"; then
                        echo "Node 20 is required"
                        exit 1
                    fi

                    npm -v
                '''
            }
        }

stage('Install Dependencies') {
            steps {
                sh '''
                    echo "Workspace: $WORKSPACE"

                    # Use workspace-local npm cache 
                    npm ci --cache "$WORKSPACE/.npm-cache"
                '''
            }
        }
         /* ---------------- APPROVAL ---------------- */

        stage('Approval Required') {
            steps {
                script {
                    emailext(
                        subject: ":rocket: Approval Required: Deploy ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                        body: """
                        CI completed successfully.

                        Job: ${env.JOB_NAME}
                        Build: #${env.BUILD_NUMBER}

                        Build URL:
                        ${env.BUILD_URL}

                        Please approve deployment in Jenkins UI.
                        """,
                        to: "${DEV_EMAIL}"
                    )

                    timeout(time: 30, unit: 'MINUTES') {
                        input message: "Approve deployment to development?", ok: "Deploy"
                    }
                }
            }
        }

                /* ---------------- DEPLOY ---------------- */

        stage('Deploy to Project Server') {
            steps {
                sshagent(['dmc-cicd-sshkey']) {
                    sh """
                        ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
                        dmc_cicd_deploy@${SERVER_IP} '

                        set -e

                        echo "Loading NVM..."
                        export NVM_DIR="\$HOME/.nvm"
                        source "\$NVM_DIR/nvm.sh"
                        nvm use 20

                        echo "Node: \$(node -v)"
                        echo "PM2: \$(pm2 -v)"

                        cd ${PROJECT_PATH}

                        echo "Current Git Branch:"
                        git branch --show-current

                        CURRENT_BRANCH=\$(git branch --show-current)
                        if [ "\$CURRENT_BRANCH" != "${DEPLOY_BRANCH}" ]; then
                            echo "Branch mismatch! Expected ${DEPLOY_BRANCH}"
                            exit 1
                        fi

                        echo "Pulling latest changes..."
                        PREV_COMMIT=\$(git rev-parse HEAD)

                        git fetch origin
                        git pull origin ${DEPLOY_BRANCH}

                        NEW_COMMIT=\$(git rev-parse HEAD)

                        echo "Checking dependency changes..."
                        if git diff --name-only \$PREV_COMMIT \$NEW_COMMIT | grep -qE "package.json|package-lock.json"; then
                            echo "Dependencies changed → running npm ci"
                            npm ci
                        else
                            echo "No dependency changes"
                        fi

                        echo "Checking migration changes..."
                        if git diff --name-only \$PREV_COMMIT \$NEW_COMMIT | grep -qE "migrations"; then
                            echo "Migration changes detected → running migration"
                            npm run migrate || true
                        else
                            echo "No migration changes"
                        fi

                        echo "Checking seed changes..."
                        if git diff --name-only \$PREV_COMMIT \$NEW_COMMIT | grep -qE "seed"; then
                            echo "Seed changes detected → running seed"
                            npm run seed || true
 
                        else
                            echo "No seed changes"
                        fi

                        echo "Building & restarting backend..."
                        pm2 reload dmc-nest

                        echo "PM2 Status:"
                        pm2 ls

                        echo "Deployment Completed Successfully"
                    '
                    """
                }
            }
        }
    }

     post {

        success {
            emailext(
                subject: ":rocket: DEPLOY SUCCESS: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                body: """
                Deployment Successful :rocket:

                Job: ${env.JOB_NAME}
                Build: ${env.BUILD_NUMBER}
                URL: ${env.BUILD_URL}

                development deployment completed successfully.
                """,
                to: "${DEV_EMAIL}"
            )
        }

        failure {
            emailext(
                subject: ":x: DEPLOY FAILED: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                body: """
                Deployment Failed :x:

                Job: ${env.JOB_NAME}
                Build: ${env.BUILD_NUMBER}
                URL: ${env.BUILD_URL}

                Check Jenkins console immediately.
                """,
                to: "${DEV_EMAIL}"
            )
        }
    }
}