#!/usr/bin/env bash
# Soma — Git Pre-Commit Hook
# Evaluates governance cells and applies mechanical enforcement blocking.
set -uo pipefail

# Resolve scripts directory
SCRIPT_DIR=""
for candidate in "vendor/soma/enzymes" ".soma/../vendor/soma/enzymes" "enzymes"; do
    if [ -d "$candidate" ]; then
        SCRIPT_DIR="$candidate"
        break
    fi
done

if [ -z "$SCRIPT_DIR" ]; then
    exit 0  # No Soma installation found, skip silently
fi

# Run cell scan
TRIGGERED=$(python3 "$SCRIPT_DIR/cell_scan.py" --json 2>/dev/null || echo '[]')
COUNT=$(echo "$TRIGGERED" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null || echo 0)

if [ "$COUNT" -gt 0 ]; then
    echo "🧬 Soma: $COUNT governance cell(s) triggered by this commit"
    python3 "$SCRIPT_DIR/cell_scan.py" 2>/dev/null
    python3 "$SCRIPT_DIR/cell_quorum.py" 2>/dev/null
fi

# Run mechanical enforcement checks
ENFORCEMENT_DIR=".soma/enforcement"
MECHANICAL_FAILED=0
if [ -d "$ENFORCEMENT_DIR" ]; then
    for check in "$ENFORCEMENT_DIR"/check-*.sh; do
        if [ -f "$check" ]; then
            bash "$check" 2>/dev/null
            if [ $? -ne 0 ]; then
                MECHANICAL_FAILED=1
            fi
        fi
    done
fi

# Check coverage on new files
NEW_FILES=$(git diff --cached --diff-filter=A --name-only 2>/dev/null)
if [ -n "$NEW_FILES" ]; then
    python3 -c "
import sys, glob, yaml
from fnmatch import fnmatch
cells_dir = '.soma/cells'
patterns = []
for f in glob.glob(f'{cells_dir}/**/*.md', recursive=True):
    try:
        with open(f) as fh: c = fh.read()
        if c.startswith('---'):
            fm = yaml.safe_load(c[3:c.find('---',3)])
            patterns.extend(fm.get('target_paths', []))
    except Exception: pass
uncovered = []
for nf in sys.stdin.read().strip().split('\n'):
    if nf and not any(fnmatch(nf, p) for p in patterns):
        uncovered.append(nf)
if uncovered:
    print('🔴 New files without governance coverage:')
    for u in uncovered:
        print(f'  ⚠️  {u}')
" <<< "$NEW_FILES" 2>/dev/null
fi

if [ "$MECHANICAL_FAILED" -ne 0 ]; then
    echo "❌ Commit blocked by mechanical enforcement gates."
    exit 1
fi

exit 0
