pipeline {
    agent any
    environment {
        DOCKER_HOST = "unix:///var/run/docker.sock"
        TOOLBOX_PATH ="/home/lucas/services/static-sites/static-toolbox"
        SOURCE_DIR = "html"
        DEPLOY_PATH = "/home/lucas/services/static-sites/site-veloboomboom/html-prod"
    }
    stages {
        stage('Check toolbox') {
            steps {
                sh """
                if ! docker image inspect static-toolbox >/dev/null 2>&1; then
                    echo "Missing toolbox, rebuild..."
                    ${env.TOOLBOX_PATH}/build
                fi
                """
            }
        }
        stage('Lint HTML') {
            steps {
                echo "Check HTML files..."
                sh """
                if ! docker image inspect static-toolbox >/dev/null 2>&1; then
                    echo "Missing toolbox, rebuild using Docker socket..."
                    # On crée l'image à la volée car Jenkins ne voit pas le script 'build'
                    echo "FROM node:20-alpine\nRUN npm install -g htmlhint\nWORKDIR /apps\nENTRYPOINT [\"htmlhint\"]" | docker build -t static-toolbox -
                fi
                """
                // sh "docker run --rm -v \$(pwd):/apps static-toolbox '${env.SOURCE_DIR}/**/*.html' --config .htmlhintrc"
            }
        }
        stage('Lighthouse Audit') {
            steps {
                echo "Prepare Lighthouse audit..."

                // Safe creation
                sh "docker rm -f lighthouse-audit || true"

                sh """
                docker create --name lighthouse-audit \
                    --user "0:0" \
                    -v /home/lucas/.npm-cache:/root/.npm \
                    -e CHROME_PATH=/usr/bin/chromium-browser \
                    -w /app \
                    zenika/alpine-chrome:latest \
                    npx --prefer-offline @lhci/cli@0.13.0 autorun --config=/app/dist/audit-config.cjs
                """

                // Inject data from tmp-dist and config to audit container 
                sh "docker cp ./${env.SOURCE_DIR}/. lighthouse-audit:/app/dist/"
                sh "docker cp .lighthouserc.cjs lighthouse-audit:/app/dist/audit-config.cjs"

                // Now run
                echo "Running Lighthouse audit..."
                sh "docker start -a lighthouse-audit"

                // Get reports
                sh "mkdir -p ./.lighthouseci"
                sh "docker cp lighthouse-audit:/app/.lighthouseci/. ./.lighthouseci/"

                // Clean
                sh "docker rm -f lighthouse-audit"
            }
        }
        stage('Deploy') {
            steps {
                echo "Deploy new site..."
                sh "mkdir -p ${env.DEPLOY_PATH}"

                h "rsync -avz --delete ${env.SOURCE_DIR}/ ${env.DEPLOY_PATH}/"
                // Update caddy-reverse-proxy cache
                sh "docker exec caddy-reverse-proxy caddy reload --config /etc/caddy/Caddyfile"
            }
        }
    }
    post {
        always { 
            echo "Publish Lighthouse audit..."
            publishHTML([
                allowMissing: true,
                alwaysLinkToLastBuild: true,
                keepAll: false,
                reportDir: '.lighthouseci',
                reportFiles: '*.html',
                reportName: 'Lighthouse Report'
            ])
            script {
                echo "Waiting for Gitea to be online..."
                
                echo "Send Gitea check..."
                // Get and store SHA
                def commitSha = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
                
                // Convert from Jenkins to Gitea API
                def buildState = (currentBuild.currentResult == 'SUCCESS') ? 'success' : 'failure'
                def buildDesc  = (currentBuild.currentResult == 'SUCCESS') ? 'Build successful' : 'Build failed'

                // Send it to Gitea API with secret 'gitea-token'
                withCredentials([string(credentialsId: 'gitea-token', variable: 'GITEA_TOKEN')]) {
                    // Use \$TOKEN to avoid jenkins to print token in logs
                    sh """
                        curl -f -X POST "${GITEA_API_URL}/repos/${GITEA_REPO_PATH}/statuses/${commitSha}" \
                             -H "Authorization: token \$GITEA_TOKEN" \
                             -H "Content-Type: application/json" \
                             -d '{"state": "${buildState}", "target_url": "${env.BUILD_URL}", "description": "${buildDesc}", "context": "jenkins-ci"}'
                    """
                }
            }
            echo "Clean unused image"
            sh "docker image prune -f" 
        }
        success { echo "Success !" }
        failure { echo "Failed." }
    }
}
