#!/usr/bin/env bash
# brain-distribuable: oui
# brain — le point d'entrée unique du brain.
#
# Usage :
#   brain init [nom] [--sans-service]  créer un brain sur cette machine (les 13 étapes)
#   brain init --verifier        les prérequis seulement — rien n'est écrit
#   brain serve [http|mcp]       les portes réseau (HTTP + MCP), une seule déclaration
#   brain serve --declaration    ce qui serait lancé, sans rien lancer
#   brain doctor                 ce qui se dégrade en silence — le brain se contrôle
#   brain maj [--appliquer]      recevoir une version du gabarit — à blanc par défaut
#   brain vue [--construire]     agents/ comme une vue du noyau et de l'instance
#   brain aligne                 reprendre le tronc, le noyau verrouillé compris
#   brain briefing [--projet P]  le briefing du boot, calculé (helloWorld le lance)
#   brain migrer [<dossier>]     un brain git passe au paquet, une fois (--a-blanc, --annuler)
#
# Les autres verbes viendront des scripts du brain, un par un (`brain <verbe>`)
# — chacun le jour où il est prêt, pas avant.
#
# Ce fichier peut être appelé par un lien (`~/.local/bin/brain`, posé par
# `brain-engine.sh install`) : il retrouve son brain par le chemin RÉEL.

set -euo pipefail

_ici="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
source "$_ici/lib/python.sh"   # python3 = celui du venv de brain-engine

# Un programme installé à part (la marque `.cortex-programme`) sert un brain situé
# ailleurs : la data se trouve (BRAIN_ROOT, le dossier courant, le brain déclaré par
# `brain init`) et chaque verbe la reçoit par `BRAIN_ROOT`. Sans la marque, rien ne
# change. `init` crée la data : il ne la cherche pas.
source "$_ici/lib/donnees.sh" 2>/dev/null || brain_donnees() { printf '%s\n' "$1"; }
_donnees=""
# `migrer` reçoit le clone à migrer : il ne cherche pas la data non plus.
if [[ "${1:-}" != "init" && "${1:-}" != "migrer" && -e "$_ici/../.cortex-programme" ]]; then
  _donnees="$(brain_donnees "$(cd "$_ici/.." && pwd)")" || exit 1
  export BRAIN_ROOT="$_donnees"
fi

case "${1:-}" in
  init)
    # Créer un brain : les prérequis d'abord, puis les 13 étapes.
    shift
    exec bash "$_ici/brain-init.sh" "$@"
    ;;
  serve)
    shift
    exec python3 "$_ici/../brain-engine/serve.py" "$@"
    ;;
  doctor)
    # Le doctor livré avec le gabarit (`brain-engine/doctor/`) joue les contrôles
    # de portée gabarit ; ses outils importent le CORE livré, d'où PYTHONPATH.
    # Sans lui — le brain d'origine —, celui du dépôt de Myéline, complet.
    shift
    _brain="$(cd "$_ici/.." && pwd)"
    if [ -f "$_brain/brain-engine/doctor/brain_doctor.py" ]; then
      PYTHONPATH="$_brain/brain-engine${PYTHONPATH:+:$PYTHONPATH}" \
        exec python3 "$_brain/brain-engine/doctor/brain_doctor.py" --brain "${_donnees:-$_brain}" --portee gabarit "$@"
    fi
    if [ -n "${MYELINE_ROOT:-}" ] && [ -f "$MYELINE_ROOT/tools/brain_doctor.py" ]; then
      exec python3 "$MYELINE_ROOT/tools/brain_doctor.py" --brain "$_brain" "$@"
    fi
    echo "brain doctor : aucun doctor dans ce brain (brain-engine/doctor/ absent)." >&2
    echo "  Le brain d'origine : MYELINE_ROOT=<dépôt de Myéline> brain doctor" >&2
    exit 2
    ;;
  maj)
    # Recevoir une version du gabarit : à blanc par défaut, `--appliquer` pour agir.
    shift
    exec python3 "$_ici/maj.py" "$@"
    ;;
  vue)
    # agents/ comme une vue du noyau et de l'instance : l'état, ou `--construire`.
    shift
    exec python3 "$_ici/vue.py" "$@"
    ;;
  aligne)
    # Reprendre la branche suivie : le verrou du noyau levé le temps de la fusion.
    shift
    exec python3 "$_ici/aligne.py" "$@"
    ;;
  migrer)
    # Un brain git passe au paquet, une fois — depuis le programme installé.
    shift
    exec python3 "$_ici/migrer.py" "$@"
    ;;
  briefing)
    # Le briefing du boot : les gestes mécaniques, faits par un script.
    shift
    exec python3 "$_ici/briefing.py" "$@"
    ;;
  ""|-h|--help|help)
    sed -n '4,15p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
    ;;
  *)
    echo "brain : verbe inconnu « $1 » — connus : init, serve, doctor, maj, vue, aligne, migrer, briefing" >&2
    exit 2
    ;;
esac
