#!/usr/bin/env bash
# pql: source .pql/hooks/pre-commit
_pql_hook="$(git rev-parse --show-toplevel)/.pql/hooks/pre-commit"; [ -f "$_pql_hook" ] && . "$_pql_hook"
# Pre-commit hook dispatcher. Runs modular checks from tooling/.
# Installed via: git config core.hooksPath .config/hooks
set -euo pipefail

REPO_ROOT="$(git rev-parse --show-toplevel)"
ERRORS=0

run_check() {
    local script="$1"
    local label="$2"
    if [ -x "$REPO_ROOT/$script" ]; then
        if ! "$REPO_ROOT/$script"; then
            ERRORS=$((ERRORS + 1))
        fi
    else
        echo "pre-commit: WARNING — $label skipped ($script not found or not executable)"
        echo "  Run 'make setup' or check that $script exists and is executable."
    fi
}

# --- Checks ---
# Ported to the reach CLI (T-1281). --no-input because a hook has no TTY and a
# prompt there does not wait, it crashes. If reach is missing the check is
# skipped with a message rather than blocking every commit on a tooling install.
if command -v reach >/dev/null 2>&1; then
    if ! reach --no-input check fact-ids; then
        ERRORS=$((ERRORS + 1))
    fi
else
    echo "pre-commit: WARNING — fact_id validation skipped (reach not on PATH)"
    echo "  Run 'make install-reach'."
fi

# --- pql: decision integrity + durable planning changelog ---
# Replaces the old SQLite decisions-sync hook. Decisions are markdown-sourced (D-8):
# `decisions validate` is the decision-ID/format gate (supersedes the never-built
# check-decision-ids), and `plan export --stage` flushes any ticket mutations to the
# git-tracked .pql/changelog/ and stages them so planning state lands in this commit.
# pql installs its own hooks into .pql/hooks, which git ignores under
# core.hooksPath=.config/hooks — so the logic is folded in here by hand instead.
if command -v pql >/dev/null 2>&1; then
    if ! pql decisions validate >/dev/null; then
        echo "pre-commit: pql decisions validate failed — malformed decision record(s)."
        ERRORS=$((ERRORS + 1))
    fi
    pql plan export --stage >/dev/null 2>&1 || \
        echo "pre-commit: WARNING — pql plan export failed; changelog not refreshed."
else
    echo "pre-commit: WARNING — pql not on PATH; decision validate + changelog export skipped."
fi

# Run cargo audit only when Cargo.toml or Cargo.lock changed
if git diff --cached --name-only | grep -qE '(Cargo\.toml|Cargo\.lock)$'; then
    echo "pre-commit: Cargo dependency change detected — running cargo audit..."
    if command -v cargo-audit >/dev/null 2>&1 || cargo audit --version >/dev/null 2>&1; then
        if ! (cd "$REPO_ROOT/server" && cargo audit); then
            ERRORS=$((ERRORS + 1))
        fi
    else
        echo "pre-commit: WARNING — cargo-audit not installed, skipping advisory check"
        echo "  Install with: cargo install cargo-audit"
    fi
fi

if [ "$ERRORS" -gt 0 ]; then
    echo ""
    echo "pre-commit: $ERRORS check(s) failed. Commit aborted."
    exit 1
fi
