pipeline {
    agent any

  triggers {
        // Trigger build on SCM changes (pushes)
        pollSCM('H/5 * * * *')  // Poll SCM every 5 minutes
    }

    environment {
        // Rust environment variables
        CARGO_HOME = '/root/.cargo'
        RUSTUP_HOME = '/root/.rustup'
        PATH = "${env.PATH}:/root/.cargo/bin"
        // Optional: Set specific Rust version
        // RUST_VERSION = '1.75.0'
    }

    stages {
        stage('Checkout') {
            steps {
                // Checkout source code
                checkout scm
            }
        }

        stage('Setup Rust') {
            steps {
                script {
                    // Check if rustup is installed, install if not
                    def rustupExists = sh(script: 'test -f /root/.cargo/bin/rustup', returnStatus: true) == 0
                    if (!rustupExists) {
                        echo 'Installing rustup...'
                        sh 'curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y'
                    }

                    // Update rustup and install stable toolchain
                    sh '/root/.cargo/bin/rustup update stable'
                    sh '/root/.cargo/bin/rustup default stable'

                    // Install additional components
                    sh '/root/.cargo/bin/rustup component add clippy rustfmt'
                }
            }
        }

        stage('Rust Info') {
            steps {
                // Display Rust and Cargo versions
                sh '/root/.cargo/bin/rustc --version'
                sh '/root/.cargo/bin/cargo --version'
            }
        }

        stage('Cache Dependencies') {
            steps {
                // Update Cargo index and cache dependencies
                sh '/root/.cargo/bin/cargo fetch'
            }
        }

        stage('Lint') {
            steps {
                // Run clippy for linting
                sh '/root/.cargo/bin/cargo clippy -- -D warnings'
            }
        }

        stage('Format Check') {
            steps {
                // Check code formatting
                sh '/root/.cargo/bin/cargo fmt -- --check'
            }
        }

        stage('Build') {
            steps {
                // Build the project
                sh '/root/.cargo/bin/cargo build --release'
            }
        }

        stage('Test') {
            steps {
                // Run tests
                sh '/root/.cargo/bin/cargo test --release'
            }
        }

        stage('Security Audit') {
            steps {
                // Optional: Run security audit
                script {
                    try {
                        sh '/root/.cargo/bin/cargo install cargo-audit || true'
                        sh '/root/.cargo/bin/cargo audit'
                    } catch (Exception e) {
                        echo "Security audit failed or not available: ${e.getMessage()}"
                    }
                }
            }
        }

        stage('Archive Artifacts') {
            steps {
                // Archive build artifacts
                script {
                    // Find and archive binary files
                    sh 'find target/release -maxdepth 1 -type f -executable -not -name "*.so" -not -name "*.d" | head -10'

                    // Archive the main binary (adjust name as needed)
                    archiveArtifacts artifacts: 'target/release/*', allowEmptyArchive: true, fingerprint: true
                }
            }
        }
    }

    post {
        always {
            // Clean workspace after build
            cleanWs()
        }

        success {
            echo 'Rust build completed successfully!'
        }

        failure {
            echo 'Rust build failed!'
            // Optional: Send notifications
        }

        unstable {
            echo 'Rust build completed with warnings!'
        }
    }
}
