#!/bin/sh
# =============================================================================
#  Hook pre-commit — dernier filet avant qu'un secret n'entre dans l'historique
#
#  Installation (une fois) :
#      git config core.hooksPath .githooks
#
#  Un secret commité reste dans l'historique Git même après suppression du
#  fichier. Ce hook coûte une seconde et évite d'avoir à régénérer des clés.
# =============================================================================

erreurs=0

# --- 1. Fichiers de secrets ---------------------------------------------------
# Le $ après twitch.php exclut twitch.php.example, qui est légitime.
interdits=$(git diff --cached --name-only \
    | grep -E '(^|/)(_secrets/twitch\.php$|\.env$|id_rsa|id_ed25519)' || true)
if [ -n "$interdits" ]; then
    echo "❌ Fichiers de secrets dans le commit :"
    echo "$interdits" | sed 's/^/     /'
    erreurs=1
fi

# --- 2. Valeurs ressemblant à des secrets -------------------------------------
# On cherche une affectation PHP dont la valeur fait 16+ caractères
# alphanumériques : la forme exacte d'une clé Twitch.
suspects=$(git diff --cached -U0 \
    | grep -E "^\+" \
    | grep -iE "(client_secret|eventsub_secret|admin_key|token_key)['\"]?\s*=>\s*['\"][A-Za-z0-9]{16,}" \
    || true)
if [ -n "$suspects" ]; then
    echo "❌ Une valeur ressemblant à un secret est ajoutée :"
    echo "$suspects" | sed 's/^/     /'
    echo "   Si c'est un faux positif : git commit --no-verify"
    erreurs=1
fi

# --- 3. Inline interdit par la CSP -------------------------------------------
inline=$(git diff --cached --name-only --diff-filter=ACM \
    | grep -E '^www/.*\.(php|html)$' || true)
if [ -n "$inline" ]; then
    for f in $inline; do
        [ -f "$f" ] || continue
        if grep -q ' style="' "$f" 2>/dev/null; then
            echo "⚠️  $f contient un attribut style inline (bloqué par la CSP)"
            erreurs=1
        fi
    done
fi

# --- 4. Syntaxe JavaScript ----------------------------------------------------
if command -v node > /dev/null 2>&1; then
    for f in $(git diff --cached --name-only --diff-filter=ACM | grep '\.js$' || true); do
        [ -f "$f" ] || continue
        node --check "$f" || erreurs=1
    done
fi

# --- 5. Syntaxe PHP -----------------------------------------------------------
if command -v php > /dev/null 2>&1; then
    for f in $(git diff --cached --name-only --diff-filter=ACM | grep '\.php$' || true); do
        [ -f "$f" ] || continue
        php -l "$f" > /dev/null || erreurs=1
    done
fi

if [ "$erreurs" -ne 0 ]; then
    echo ""
    echo "Commit bloqué. Corrigez, ou forcez avec --no-verify si vous êtes sûr."
    exit 1
fi

exit 0
