#!/bin/sh
# post-commit：每次提交后自动打 bundle 灾备（节流：距上次 bundle < 15 分钟则跳过）。
#
# 背景：本项目无远端（2026-08-12 拍板暂不 push），历史只存本地 .git。
#   - 2026-09-09 16:38 末次提交 → run_all 窗口 → .git 丢失（不可恢复）
#   - 2026-09-10 14:30 run_all 窗口 → .git 再次丢失（本次）
# 两次都发生在 run_all.py 运行窗口内，静态审计找不到删除路径（疑宿主沙箱/并行进程）。
# 结论：与其追查不可复现的删除路径，不如让「备份紧跟提交」——每次提交后 15 分钟内
#       必有一次新鲜 bundle，最坏只丢「最近一次提交」，而非整段历史。
#
# 失败不阻塞提交（任何异常一律 exit 0，只打印 WARN）。

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

BACKUP_ROOT="D:/workbuddy文件/.git_backups"   # 与 scripts/git_bundle_backup.py 的 BACKUP_ROOT 一致
THROTTLE_SEC=900                              # 15 分钟

PY="$(command -v python 2>/dev/null || command -v python3 2>/dev/null)"
if [ -z "$PY" ]; then
  echo "WARN: post-commit: 未找到 python，跳过 bundle 灾备（备份未更新）" >&2
  exit 0
fi

# 【无节流】同步刷新 .git 热镜像（自愈看门狗的恢复源）——每次提交都必须刷新，
# 且必须放在下面 bundle 的节流 exit 之前，否则被节流跳过时镜像会滞后。
if [ -f scripts/git_guard.py ]; then
  if "$PY" scripts/git_guard.py --sync-only >/dev/null 2>&1; then
    echo "post-commit: .git 热镜像已同步"
  else
    echo "WARN: post-commit: .git 热镜像同步失败（看门狗会自行补上）" >&2
  fi
fi

if [ ! -f scripts/git_bundle_backup.py ]; then
  exit 0
fi

# 节流：若最近一次 bundle 在 THROTTLE_SEC 内，跳过（镜像同步已在上面完成）
NEWEST="$(ls -1t "$BACKUP_ROOT"/home-ai-tutor-*.bundle 2>/dev/null | head -1)"
if [ -n "$NEWEST" ]; then
  MT="$(stat -c %Y "$NEWEST" 2>/dev/null || stat -f %m "$NEWEST" 2>/dev/null || echo 0)"
  NOW="$(date +%s)"
  if [ "$MT" != "0" ] && [ "$((NOW - MT))" -lt "$THROTTLE_SEC" ]; then
    exit 0
  fi
fi

# 同步打 bundle（节流后每次提交最多触发一次；失败只 WARN）
if "$PY" scripts/git_bundle_backup.py >/dev/null 2>&1; then
  echo "post-commit: bundle 灾备已更新"
else
  echo "WARN: post-commit: bundle 灾备失败（下次提交重试）" >&2
fi
exit 0
