#!/usr/bin/env bash
# Purpose: Advisory pre-save/commit check. The scratch dirs (tmp/, temp/, .claude/tmp/)
#          are gitignored, so anything in them is INVISIBLE to git and will be lost on
#          cleanup. Before a /save or /scc, surface what's sitting there and flag the
#          files worth GRADUATING to a permanent home (per .claude/TEMP_GRADUATION.md).
# Usage:   bash .claude/scripts/tmp-promotion-check.sh
# Behavior: read-only, never blocks. Always exits 0. Prints nothing when scratch is empty.
# Origin:  added 2026-06-12 (wired into /save + /scc). See feedback in TEMP_GRADUATION.md.

set -u

ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
cd "$ROOT" || exit 0

SCRATCH_DIRS=(tmp temp .claude/tmp)

# Collect files across the scratch dirs (skip the dirs themselves; ignore .gitkeep).
mapfile -t FILES < <(
  for d in "${SCRATCH_DIRS[@]}"; do
    [ -d "$d" ] || continue
    find "$d" -type f ! -name '.gitkeep' 2>/dev/null
  done
)

[ "${#FILES[@]}" -eq 0 ] && exit 0   # nothing in scratch — stay silent

echo "[INFO] Promotion check: ${#FILES[@]} file(s) in scratch dirs (gitignored — NOT committed)."
echo "       Graduate anything worth keeping before it's lost. Guide: .claude/TEMP_GRADUATION.md"

# PURE-BUILTIN loop (no per-file subprocesses) — `basename`/`wc` forks ×N hung this for
# 20s+ on Windows Git-bash at ~240 scratch files (fork is expensive). Flag scripts by
# extension only; deep triage (doc size, "is it referenced", what's it for) is deferred to
# the async Ollama graduation pass (see TEMP_GRADUATION.md). Keep this O(N) and fork-free.
candidates=0
for f in "${FILES[@]}"; do
  case "${f##*/}" in
    *.py|*.sh|*.ps1|*.psm1|*.js|*.rb|*.pl|*.php)
      echo "       [GRADUATE?] $f  (script)"
      candidates=$((candidates + 1)) ;;
  esac
done

if [ "$candidates" -eq 0 ]; then
  echo "       No graduation candidates (looks like pure scratch — safe to leave or delete)."
else
  echo "       -> $candidates candidate(s). Move with: git mv <file> <scripts/|clients/<x>/reports/|projects/<p>/tools/>"
fi

exit 0
