#!/bin/sh
# ---------------------------------------------------------------------------
# MSOS pre-commit hook — keeps derived files in sync automatically.
#
# On every commit it regenerates and stages:
#   - the technical-SEO <head> block on every page + sitemap.xml/robots.txt
#     (tools/seo_inject.py) — canonical, hreflang, meta, and the JSON-LD schema
#     (Organization/NGO, Article, Event, FAQPage). Idempotent: unchanged pages
#     produce no diff, so it only ever stages pages whose content actually moved.
#   - the News hub grid + homepage "Latest news"   (tools/build_listings.py)
#   - /llms.txt and /links-for-bots/               (tools/build_botlinks.py)
# so adding a blog post or an event/project flows through to its schema, the
# sitemap, News, the homepage and the bot pages without any manual command.
#
# It never blocks a commit: if Python or a generator fails, it warns and lets
# the commit proceed.
#
# Activate once per clone:   git config core.hooksPath tools/git-hooks
# ---------------------------------------------------------------------------
set -u

PY="$(command -v python || command -v python3 || true)"
if [ -z "$PY" ]; then
    echo "pre-commit: Python not found — skipping News/bot regeneration." >&2
    exit 0
fi

# Run from the repo root regardless of where git invoked the hook.
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
cd "$ROOT" || exit 0

# SEO/schema first, so build_listings sees fresh dates and new pages are in the
# sitemap. --all rewrites every page's SEO block idempotently; --sitemap also
# refreshes sitemap.xml + robots.txt.
"$PY" tools/seo_inject.py --all --sitemap >/dev/null 2>&1 \
    || echo "pre-commit: seo_inject.py failed — SEO/schema not refreshed." >&2
"$PY" tools/build_listings.py >/dev/null 2>&1 \
    || echo "pre-commit: build_listings.py failed — News/homepage not refreshed." >&2
"$PY" tools/build_botlinks.py >/dev/null 2>&1 \
    || echo "pre-commit: build_botlinks.py failed — bot pages not refreshed." >&2

# Re-stage generated/derived outputs (no-op when unchanged). `git add -u` only
# touches already-tracked files, so an unrelated commit stages nothing new.
git add -u en mk si >/dev/null 2>&1 || true
git add -- sitemap.xml robots.txt llms.txt links-for-bots >/dev/null 2>&1 || true

exit 0
