pipeline {
    agent any
    environment {
        GITEA_REPO_PATH = "lucas/site-veloboomboom"
        GITEA_API_URL = "https://gitea.lucasroyer.fr/api/v1"
        DOCKER_HOST = "unix:///run/user/1001/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 using Docker socket..."
                    # On crée l'image à la volée car Jenkins ne voit pas le script 'build'
                    echo "FROM node:25-alpine\nRUN npm install -g htmlhint\nWORKDIR /apps\nENTRYPOINT [\"htmlhint\"]" | docker build -t static-toolbox -
                fi
                """
                // 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 "docker run --rm --volumes-from jenkins -w \$(pwd) static-toolbox '${env.SOURCE_DIR}/**/*.html' --config .htmlhintrc"
            }
        }
        stage('Lighthouse Audit') {
            steps {
             echo "Running Lighthouse audit..."
                // Clean old report and containers
                sh """
                    docker run --rm --volumes-from jenkins -w \$(pwd) alpine:latest \
                    sh -c "rm -rf ./.lighthouseci && mkdir -p ./.lighthouseci && chmod 777 ./.lighthouseci"
                """
                
                sh "docker rm -f lighthouse-audit || true"
                
                // Run
                sh """
                docker run --name lighthouse-audit \
                    --volumes-from jenkins \
                    -w \$(pwd) \
                    -e CHROME_PATH=/usr/bin/chromium-browser \
                    -v /home/lucas/.npm-cache:/tmp/npm-cache \
                    -e npm_config_cache=/tmp/npm-cache \
                    --entrypoint "" \
                    zenika/alpine-chrome:with-node \
                    npx --prefer-offline -p @lhci/cli@0.13.0 lhci autorun --config=./.lighthouserc.cjs
                """

                // Clean
                sh "docker rm -f lighthouse-audit"
            }
        }

        stage('Deploy') {
            steps {
                echo "Deploying via Docker mount..."
                // Copy with docker alpine
                sh """
                docker run --rm \
                    --volumes-from jenkins \
                    -v /home/lucas/services/static-sites/site-veloboomboom:/home/lucas/services/static-sites/site-veloboomboom \
                    -w \$(pwd) \
                    alpine:latest \
                    sh -c "mkdir -p ../html-new && cp -R html/* ../html-new/ && mv -T ../html-new ../html-prod"
                """
                
                echo "Reloading Caddy..."
                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'
            ])

            echo "Cleaning up workspace..."
            sh "rm -rf ./.lighthouseci"

            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." }
    }
}
