pipeline {
    agent any
    environment {
        DOCKER_HOST = "unix:///var/run/docker.sock"
        APP_VERSION = "${env.BRANCH_NAME}-${env.BUILD_NUMBER}"
    }
    stages {
        stage('Build') {
            steps {
                // Get Caddy version
                sh "cp .env.dist .env"
                // Push portfolio version
                sh "echo '\nPORTFOLIO_VERSION=${env.APP_VERSION}' >> .env"

                echo "Building new portfolio version..."
                sh "docker compose build"
            }
        }
        stage('Lighthouse Audit') {
            steps {
                // Temporary container to get data in /dist folder
                // Reuse of just build portfolio image
                sh "mkdir -p ./dist-audit ./.lighthouseci"
                sh "docker create --name audit-tmp portfolio:${env.APP_VERSION}"
                sh "docker cp audit-tmp:/usr/share/caddy/. ./dist-audit"
                sh "docker rm audit-tmp"

                // Add audit config in the same folder
                sh "cp .lighthouserc.cjs ./dist-audit/audit-config.cjs"

                // Launch special service in docker compose
                sh "docker compose --profile audit run --rm lighthouse-audit"
            }
        }
        stage('Deploy') {
            // Deploy only master branch
            when {
                branch 'master'
            }
            steps {
                echo "Deploy new portfolio version..."
                sh "docker compose up -d"

                // Update caddy-reverse-proxy cache
                sh "docker exec caddy-reverse-proxy caddy reload --config /etc/caddy/Caddyfile"

                // Keep updated docker-compose.yml and Caddyfile for safety
                sh "cp docker-compose.yml /backup-portfolio/docker-compose.yml"
                sh "docker cp portfolio:/etc/caddy/Caddyfile /backup-portfolio/Caddyfile"
            }
        }
    }
    post {
        always { 
            echo "Publish Lighthouse audit..."
            publishHTML([
                allowMissing: true,
                alwaysLinkToLastBuild: true,
                keepAll: false,
                reportDir: '.lighthouseci',
                reportFiles: 'index.html',
                reportName: 'Lighthouse Report'
            ])
            echo "Clean unused image and files..."
            sh "docker image prune -f" 
            sh "rm -rf ./dist-audit"
        }
        success { echo "Success !" }
        failure { echo "Failed." }
    }
}
