#!/usr/bin/env bash
# make_fixtures.sh — regenerate the committed replay fixtures.
#
# TRACES: VR-001 | PR-002
#
# CI never calls a model (see docs/requirements.md, "CI never calls a model"):
# the embedder is impractical on the N100 CI host, so inference happens HERE, on
# a machine with a GPU, and CI consumes the HDF5 dumps as data. Everything
# downstream of embedding — tracking, presence windows, belief accumulation,
# expansion — is cheap CPU maths and replays from these files.
#
# Reproducibility is a requirement, not a nicety. A fixture whose provenance is
# unknown is worse than no fixture, because it will be trusted. Every parameter
# that affects the output is pinned below rather than left to a default, and the
# dumps carry the embedder identity and SHA-256 (GR-004) so a replay cannot be
# silently scored against the wrong gallery.
#
# These are byte-reproducible only because node outputs block rather than drop
# on a full channel (AR-004). Before that fix the same command produced
# different dumps run to run, since what got dropped depended on timing.
#
# Source: hero/ — SuperHero, from the TRECVID DVU development set. Chosen over
# SuperHero on face scale: Bali reference crops had a median detected face of
# 27 px against a 69 px maximum, so every reference was upscaled far past what
# the embedder was trained for. SuperHero is 69 px median, 241 px max. That matters: derived
# fixtures can be committed, where anything cut from a copyrighted title could
# not live in the repository at all.
set -euo pipefail

REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CLIPS="${CLIPS:-$REPO/../hero}"
GALLERY="${GALLERY:-$REPO/gallery_lvface.h5}"
BIN="${BIN:-$REPO/build/scene_analyze}"
OUT="$REPO/tests/fixtures/dumps"

# Pinned. Changing either invalidates every committed fixture.
#   fps 5      — 1 fps over a 77 s clip is 77 frames, too thin to exercise an
#                extinction window measured in tens of seconds.
#   min-face   — 32 px. This is a *fixture* setting, deliberately below AR-002's
#                production floor of 40 px (VR-013, measured end to end): the
#                corpus is 480x360, where faces run 40-80 px, so pinning at 40
#                would thin the dumps for reasons unrelated to what they test.
#                32 px is where VR-005 still shows 98.1% TPI, so the faces kept
#                are identifiable; it is not the threshold the pipeline ships.
FPS=5
MIN_FACE_PX=32

[[ -x "$BIN"      ]] || { echo "no scene_analyze at $BIN (set BIN=)" >&2; exit 1; }
[[ -f "$GALLERY"  ]] || { echo "no gallery at $GALLERY (set GALLERY=)" >&2; exit 1; }
[[ -d "$CLIPS"    ]] || { echo "no clips at $CLIPS (set CLIPS=)" >&2; exit 1; }

mkdir -p "$OUT"

for clip in "$CLIPS"/SuperHero-*.webm; do
    n="$(basename "$clip" .webm)"; n="${n##*-}"
    echo "── superhero_$n"
    "$BIN" --movie "$clip" --gallery "$GALLERY" \
           --fps "$FPS" --min-face-px "$MIN_FACE_PX" \
           --dump-embeddings "$OUT/superhero_$n.h5" \
           --output /dev/null 2>&1 | grep -E "wrote|dropped" || true
done

echo
echo "Regenerated in $OUT — verify the diff is empty if nothing upstream changed."
echo "A non-empty diff means detection, alignment or embedding moved. That is"
echo "either a regression or a deliberate change, and either way the golden"
echo "outputs derived from these fixtures need reviewing."
