pipeline {
    agent any
    environment {
        MAX_RETRIES = 5
    }
    stages {
        stage('Gradle') {
            steps {
                script {
                    def retryCount = 0
                    def success = false

                    // Clean npm cache and try normal install and npm ci once
                    sh 'npm cache clean --force'
                    try {
                        sh 'npm install'
                        success = true
                    } catch (Exception e1) {
                        echo "npm install failed, trying npm ci..."
                        try {
                            sh 'npm ci'
                            success = true
                        } catch (Exception e2) {
                            echo "npm ci failed, proceeding to retry with --legacy-peer-deps and --force..."
                        }
                    }

                    // Retry with --legacy-peer-deps and --force if necessary
                    while (retryCount < MAX_RETRIES.toInteger() && !success) {
                        try {
                            sh 'npm install --legacy-peer-deps'
                            success = true
                        } catch (Exception e3) {
                            try {
                                sh 'npm install --force'
                                success = true
                            } catch (Exception e4) {
                                retryCount++
                                echo "Retry ${retryCount}/${MAX_RETRIES} failed"
                            }
                        }
                    }

                    if (!success) {
                        error "Failed to install dependencies after ${MAX_RETRIES} attempts"
                    }

                    sh 'npm run build'
                }
            }
        }
        stage('Archive') {
            steps {
                archiveArtifacts artifacts: 'build/**', followSymlinks: false
            }
        }
        stage('discord') {
            when {
               branch 'main'
               branch 'master'
            }
            steps {
                discordSend description: "Build: ${BUILD_NUMBER}", showChangeset: true, result: currentBuild.currentResult, title: currentBuild.fullProjectName, webhookURL: env.discordwebhook
            }
        }
    }
}
