#!/usr/bin/env bash
# REC-261: dirty abandoned worktrees report STALE-WIP, but are never removed.
set -uo pipefail

REAPER="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/worktree_reaper.sh"
ROOT="$(mktemp -d)" || { echo "mktemp failed" >&2; exit 1; }
case "$ROOT" in
  /*) ;;
  *) echo "bad temp root: $ROOT" >&2; exit 1 ;;
esac
[ -d "$ROOT" ] || { echo "temp root is not a directory: $ROOT" >&2; exit 1; }
ROOT="$(cd "$ROOT" && pwd -P)"
[ -n "$ROOT" ] || { echo "empty temp root" >&2; exit 1; }
case "$ROOT" in
  /tmp/*|/var/folders/*|/private/var/folders/*) ;;
  *) echo "bad temp root: $ROOT" >&2; exit 1 ;;
esac
PASS=0
FAIL=0

ok(){ echo "  OK: $1"; PASS=$((PASS+1)); }
no(){ echo "  FAIL: $1"; FAIL=$((FAIL+1)); }

cleanup() {
  [ -n "${ROOT:-}" ] && [ -d "$ROOT" ] || return 0
  case "$ROOT" in
    /tmp/*|/var/folders/*|/private/var/folders/*) rm -rf "$ROOT" ;;
  esac
}
trap cleanup EXIT

test -f "$REAPER" || { echo "FATAL: reaper not found at $REAPER"; exit 1; }

ORIGIN="$ROOT/origin.git"
REPO="$ROOT/repo"
HOME_DIR="$ROOT/home"
mkdir -p "$HOME_DIR"

git init -q --bare "$ORIGIN"
git init -q "$REPO"
(
  cd "$REPO" || exit 1
  git config user.email t@t
  git config user.name t
  echo "base" > README.md
  git add README.md
  git commit -qm init
  git branch -M main
  git remote add origin "$ORIGIN"
  git push -q -u origin main
)

make_dirty_worktree() {
  local name="$1" heartbeat="$2" age_sec="$3"
  local wt="$ROOT/${name}-wt"
  git -C "$REPO" worktree add -q -b "$name" "$wt" origin/main
  (
    cd "$wt" || exit 1
    git config user.email t@t
    git config user.name t
    python3 - "$heartbeat" > .session-lease.json <<'PY'
import json
import sys
print(json.dumps({
    "sid": "test",
    "host": "testhost",
    "heartbeat": sys.argv[1],
    "expires_at": "2099-01-01T00:00:00Z",
}))
PY
    git add .session-lease.json
    git commit -qm lease
    echo "dirty" > dirty.txt
    python3 - "$age_sec" README.md .session-lease.json dirty.txt <<'PY'
import os
import sys
import time
age = int(sys.argv[1])
mtime = time.time() - age
for path in sys.argv[2:]:
    os.utime(path, (mtime, mtime))
PY
  )
  printf '%s\n' "$wt"
}

OLD_HEARTBEAT="$(python3 - <<'PY'
import time
print(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - 7200)))
PY
)"
FRESH_HEARTBEAT="$(python3 - <<'PY'
import time
print(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()))
PY
)"

STALE_WT="$(make_dirty_worktree stale-wip "$OLD_HEARTBEAT" 10800)"
STALE_OUT="$(HOME="$HOME_DIR" CANONICAL_REPO="$REPO" LIVE_WINDOW_SEC=600 STALE_WIP_MTIME_SEC=7200 bash "$REAPER" 2>&1)"
printf '%s\n' "$STALE_OUT" | grep -q "STALE-WIP" \
  && ok "stale dirty worktree reports STALE-WIP" || no "stale dirty worktree did not report STALE-WIP"
test -d "$STALE_WT" \
  && ok "stale dirty worktree was not removed" || no "stale dirty worktree was removed"

FRESH_WT="$(make_dirty_worktree active-wip "$FRESH_HEARTBEAT" 10800)"
FRESH_OUT="$(HOME="$HOME_DIR" CANONICAL_REPO="$REPO" LIVE_WINDOW_SEC=600 STALE_WIP_MTIME_SEC=7200 bash "$REAPER" 2>&1)"
printf '%s\n' "$FRESH_OUT" | grep -Fq "KEEP        $FRESH_WT" \
  && ok "fresh dirty worktree reports KEEP" || no "fresh dirty worktree did not report KEEP"
printf '%s\n' "$FRESH_OUT" | grep -Fq "STALE-WIP   $FRESH_WT" \
  && no "fresh dirty worktree reported STALE-WIP" || ok "fresh dirty worktree did not report STALE-WIP"
test -d "$FRESH_WT" \
  && ok "fresh dirty worktree was not removed" || no "fresh dirty worktree was removed"

echo ""
echo "worktree_reaper_stale_wip: pass=$PASS fail=$FAIL"
test "$FAIL" -eq 0
