#!/bin/bash
# brain-write-validator — Aria-Brain-Integritaets-Hook (KAR-593, obsidian-mind-Adoption)
#
# PostToolUse-Hook auf Write|Edit. Feuert NUR bei Markdown-Notes im Brain-Vault
# (/home/aria/brain/...). Prueft frisch geschriebene/editierte Notes auf:
#   1. Frontmatter-Vollstaendigkeit + Schema  (markdown_frontmatter.py)
#   2. Wikilink-Integritaet (keine Dangling-Links) (markdown_wikilinks.py)
#
# Zweck: gegen stille Brain-Drift. Eine Note darf nicht in broken state landen
# ohne dass Aria es im selben Zug sieht. PostToolUse laeuft NACH dem Write —
# der Write wird nicht rueckgaengig gemacht, aber exit 2 zeigt die Befunde
# inline an Aria, die im selben Turn nachbessert ("inline-Warnung bevor der
# Agent weiterzieht", obsidian-mind-Pattern).
#
# Input  : Claude Code PostToolUse JSON via stdin
# Output : exit 0 = sauber/irrelevant, exit 2 = Befunde an Aria (stderr)
#
# Bypass : env BRAIN_VALIDATOR_BYPASS=1
#          in-file Marker  brain-validator:skip
#
# Spec   : brain://02-Wissen/multi-source-audit-2026-05-24-b.md
# KAR    : 593

set -u

# Absolute Pfade bewusst inline (keine Variable) — so kann aria-verify.py die
# Validator-Abhaengigkeiten statisch finden + ihre Existenz pruefen (KAR-589).
BRAIN=/home/aria/brain

if [ "${BRAIN_VALIDATOR_BYPASS:-0}" = "1" ]; then
    exit 0
fi

PAYLOAD=$(cat)

TOOL_NAME=$(printf '%s' "$PAYLOAD" \
    | python3 -c "import sys,json; d=json.loads(sys.stdin.read() or '{}'); print(d.get('tool_name',''))" \
    2>/dev/null)

case "$TOOL_NAME" in
    Write|Edit) ;;
    *) exit 0 ;;
esac

FILE_PATH=$(printf '%s' "$PAYLOAD" \
    | python3 -c "import sys,json; d=json.loads(sys.stdin.read() or '{}'); print(d.get('tool_input',{}).get('file_path',''))" \
    2>/dev/null)

# Nur Markdown-Notes im Brain-Vault.
case "$FILE_PATH" in
    "${BRAIN}"/*.md) ;;
    *) exit 0 ;;
esac

# Schema-Konvention gilt nur fuer echte Notes, nicht fuer Identity-/System-Root-
# Files (SOUL.md etc.) oder archivierte Logs — die folgen eigenen Formaten.
BASE=$(basename "$FILE_PATH")
case "$BASE" in
    SOUL.md|IDENTITY.md|USER.md|TOOLS.md|ENGINEERING.md|CORRECTIONS.md|\
    SELF-IMPROVEMENT.md|HEARTBEAT.md|HOOKS.md|HANDOFF.md|CLAUDE.md|\
    CLAUDE.archive.md|MEMORIES.md|FEATURE_REQUESTS.md|README.md|INDEX.md|\
    WEEKLY-FOCUS.md) exit 0 ;;
esac
case "$FILE_PATH" in
    */Archiv/*|*.archive/*|*/06-Daily/*) exit 0 ;;
esac

if [ -f "$FILE_PATH" ] && grep -q "brain-validator:skip" "$FILE_PATH" 2>/dev/null; then
    exit 0
fi

[ -f "$FILE_PATH" ] || exit 0   # Edit auf bereits-geloeschte Datei o.ae.

# --- 1. Frontmatter ---
FM_OUT=$(python3 /home/aria/.claude/hooks/validators/markdown_frontmatter.py --input "$FILE_PATH" 2>&1)
FM_RC=$?

# --- 2. Wikilinks ---
WL_OUT=$(python3 /home/aria/.claude/hooks/validators/markdown_wikilinks.py --input "$FILE_PATH" 2>&1)
WL_RC=$?

if [ "$FM_RC" -eq 0 ] && [ "$WL_RC" -eq 0 ]; then
    exit 0
fi

{
    echo "[brain-write-validator] Integritaets-Befunde fuer:"
    echo "  $FILE_PATH"
    echo ""
    if [ "$FM_RC" -ne 0 ]; then
        echo "── CRITICAL · Frontmatter/Schema (muss gefixt werden) ──"
        echo "$FM_OUT"
        echo ""
    fi
    if [ "$WL_RC" -ne 0 ]; then
        echo "── WARN · Wikilink-Integritaet (Dangling-Links, Graph-Bruch) ──"
        echo "$WL_OUT"
        echo ""
        echo "Fix: Ziel-Note anlegen, Link korrigieren, oder bewusster Forward-Ref"
        echo "stehen lassen (dann ist diese Meldung nur ein Hinweis)."
    fi
    echo ""
    echo "Bypass fuer diese Datei: Marker  brain-validator:skip  einfuegen."
    echo "Bypass global (eine Aktion): env BRAIN_VALIDATOR_BYPASS=1"
} >&2

exit 2
