#!/usr/bin/env bash
# install-release-hooks.sh — 安装 agent pool 自动释放的两条防线
#   1. Claude Code SessionEnd hook（主路）—— session 退出立即释放
#   2. user crontab 每 5 分钟 sweep（兜底）—— hook 没跑成时的二道防线
#
# 幂等：重复跑不会重复加。带 --dry-run 看会改什么。
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=../lib/agent-pool-lib.sh
source "${SCRIPT_DIR}/../lib/agent-pool-lib.sh"
# 主仓库根（在 worktree/slot 里被调用时也指向主仓库；slot 释放后 worktree 路径会失效）
REPO_ROOT="$(cd "${SCRIPT_DIR}" && ap_main_repo_dir)"
HOOK_SCRIPT="${REPO_ROOT}/scripts/dev/agent-pool/hooks/on-session-end.sh"
SWEEP_SCRIPT="${REPO_ROOT}/scripts/dev/agent-pool/agent-sweep.sh"

DRY_RUN=false
SKIP_HOOK=false
SKIP_CRON=false
while [[ $# -gt 0 ]]; do
  case "$1" in
    --dry-run) DRY_RUN=true; shift ;;
    --skip-hook) SKIP_HOOK=true; shift ;;
    --skip-cron) SKIP_CRON=true; shift ;;
    -h|--help)
      cat <<EOF
用法: bash $0 [--dry-run] [--skip-hook] [--skip-cron]
  --dry-run     仅展示会做什么，不真改
  --skip-hook   跳过 Claude Code SessionEnd hook 安装
  --skip-cron   跳过 crontab 安装
EOF
      exit 0 ;;
    *) echo "未知参数: $1" >&2; exit 1 ;;
  esac
done

echo "== Agent Pool 自动释放安装 =="
echo "  仓库根:   ${REPO_ROOT}"
echo "  hook:     ${HOOK_SCRIPT}"
echo "  sweep:    ${SWEEP_SCRIPT}"
echo "  dry-run:  ${DRY_RUN}"
echo

# ----- 1. Claude Code SessionEnd hook -----
if [[ "${SKIP_HOOK}" != true ]]; then
  SETTINGS_FILE="${HOME}/.claude/settings.json"
  echo "[1/2] Claude Code SessionEnd hook → ${SETTINGS_FILE}"

  if ! command -v python3 >/dev/null 2>&1; then
    echo "  ⚠ 没 python3，跳过 hook 安装（请手工把以下命令加到 settings.json 的 hooks.SessionEnd）："
    echo "    bash ${HOOK_SCRIPT}"
  else
    mkdir -p "$(dirname "${SETTINGS_FILE}")"
    [[ -f "${SETTINGS_FILE}" ]] || echo "{}" > "${SETTINGS_FILE}"

    SETTINGS_FILE="${SETTINGS_FILE}" \
    HOOK_CMD="bash ${HOOK_SCRIPT}" \
    DRY_RUN="${DRY_RUN}" \
    python3 - <<'PYEOF'
import json
import os
import sys

settings_file = os.environ['SETTINGS_FILE']
hook_cmd = os.environ['HOOK_CMD']
dry_run = os.environ['DRY_RUN'] == 'true'

with open(settings_file) as f:
    try:
        settings = json.load(f)
    except json.JSONDecodeError:
        print(f"  ✗ settings.json 解析失败，跳过", file=sys.stderr)
        sys.exit(0)

hooks = settings.setdefault('hooks', {})
session_end = hooks.setdefault('SessionEnd', [])

# 归一：旧 settings 可能是 [{"command": "..."}, ...] 或 [{"hooks":[{"command":...}]}, ...]
already = False
for entry in session_end:
    if isinstance(entry, dict):
        if entry.get('command') == hook_cmd:
            already = True
            break
        for sub in entry.get('hooks', []) or []:
            if isinstance(sub, dict) and sub.get('command') == hook_cmd:
                already = True
                break
        if already:
            break

if already:
    print(f"  ✓ hook 已存在，无需重复添加")
    sys.exit(0)

if dry_run:
    print(f"  [dry-run] 将向 hooks.SessionEnd 添加: {hook_cmd}")
    sys.exit(0)

# 加在末尾
session_end.append({"command": hook_cmd})

tmp = f'{settings_file}.tmp.{os.getpid()}'
with open(tmp, 'w') as f:
    json.dump(settings, f, indent=2, ensure_ascii=False)
    f.write('\n')
os.replace(tmp, settings_file)
print(f"  ✓ 已添加 hook 到 {settings_file}")
PYEOF
  fi
else
  echo "[1/2] 跳过 hook 安装（--skip-hook）"
fi

echo

# ----- 2. user crontab 兜底 sweep -----
if [[ "${SKIP_CRON}" != true ]]; then
  echo "[2/2] crontab 每 5 分钟 sweep"

  CRON_TAG="# agent-pool-sweep"
  CRON_CMD="cd ${REPO_ROOT} && bash ${SWEEP_SCRIPT}"
  CRON_LINE="*/5 * * * * ${CRON_CMD} >> /tmp/agent-pool-sweep.log 2>&1 ${CRON_TAG}"

  CURRENT=$(crontab -l 2>/dev/null || true)
  if grep -qF "${CRON_TAG}" <<<"${CURRENT}"; then
    echo "  ✓ crontab 已含 agent-pool-sweep，无需重复添加"
  elif [[ "${DRY_RUN}" == true ]]; then
    echo "  [dry-run] 将向 crontab 追加: ${CRON_LINE}"
  else
    { printf "%s\n" "${CURRENT}"; printf "%s\n" "${CRON_LINE}"; } | crontab -
    echo "  ✓ 已添加 crontab 行"
    echo "    日志:  tail -f /tmp/agent-pool-sweep.log"
  fi
else
  echo "[2/2] 跳过 crontab 安装（--skip-cron）"
fi

echo
echo "完成。校验："
echo "  hook:  cat ~/.claude/settings.json | python3 -m json.tool | grep -A2 SessionEnd"
echo "  cron:  crontab -l | grep agent-pool-sweep"
