#!/usr/bin/env bash
# brain-distribuable: oui
# workspace-satellite — le backlog se juge au commit, quand `workspace/` est un satellite
#
# Lancé par le lanceur qu'install-brain-hooks.sh pose dans `workspace/.git/hooks`
# (pre-commit), le nom du hook en premier argument.
#
# Une fiche close sans le rapport que lit le contrôle passait le commit : le dépôt n'avait
# aucun hook, et seuls le doctor et `kanban tenir` jugent les clôtures — après coup (une
# fiche close le 14/10). Ce hook joue les outils des fiches sur les SEULS projets que le commit touche
# (`backlog/<projet>/`) : un défaut ailleurs ne bloque pas un travail qui n'y touche pas.
#
# Les outils vivent dans Myéline, trouvée par le `chemin:` que `satellites.yml` lui déclare.
# Sans elle (un fork, une machine qui ne l'a pas), le hook se tait. Depuis un worktree de
# `workspace` aussi : les outils lisent le dossier du brain, ils jugeraient un autre arbre.
# `--no-verify` passe outre ; le doctor rattrape.

hook="${1:-}"
[[ "$hook" == "pre-commit" ]] || exit 0

SAT_WT="$(git rev-parse --show-toplevel)"
SAT_MAIN="$(cd "$SAT_WT" && cd "$(git rev-parse --git-common-dir)/.." && pwd)"
[[ "$SAT_WT" != "$SAT_MAIN" ]] && exit 0

BRAIN_MAIN="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
source "$BRAIN_MAIN/scripts/lib/python.sh" 2>/dev/null || true

projets=$(git diff --cached --name-only | sed -nE 's#^backlog/([^/]+)/.*#\1#p' | sort -u)
[[ -n "$projets" ]] || exit 0

MYELINE=$(python3 - "$BRAIN_MAIN/satellites.yml" <<'PY' 2>/dev/null
import os, sys
try:
    import yaml
    d = yaml.safe_load(open(sys.argv[1], encoding="utf-8")) or {}
except Exception:
    sys.exit(0)
chemin = ((d.get("satellites") or {}).get("myeline") or {}).get("chemin")
if chemin:
    print(os.path.expanduser(str(chemin)))
PY
)
OUTILS="${MYELINE:+$MYELINE/tools}"
[[ -n "$OUTILS" && -f "$OUTILS/cloture_backlog.py" && -f "$OUTILS/index_backlog.py" ]] || exit 0

journal="$(mktemp)"
trap 'rm -f "$journal"' EXIT
rouges=()
for projet in $projets; do
    python3 "$OUTILS/cloture_backlog.py" --brain "$BRAIN_MAIN" --projet "$projet" >> "$journal" 2>&1 \
        || rouges+=("$projet : cloture_backlog rougit — une fiche close sans son rapport ?")
    python3 "$OUTILS/index_backlog.py" --brain "$BRAIN_MAIN" --projet "$projet" --check >> "$journal" 2>&1 \
        || rouges+=("$projet : index_backlog --check rougit — l'index ne dit plus ce que les fiches disent ?")
done
(( ${#rouges[@]} )) || exit 0
grep -E "❌" "$journal" | head -8 | sed 's/^/   /' >&2

echo "🚫 workspace — le backlog ne tient pas, commit refusé :" >&2
for r in "${rouges[@]}"; do echo "   • $r" >&2; done
cat >&2 <<'MSG'

   Une fiche close porte son rapport, sous son titre :
     > **Clôture** — mesuré : <avant> → <après> · tenu par : <quoi>
   L'index se régénère : python3 <myeline>/tools/index_backlog.py --brain <brain> --projet <projet> --ecrire
   Levée consciente : git commit --no-verify (le doctor le rattrapera).
MSG
exit 1
