#!/usr/bin/env bash
# strategic-compact.sh: Claude Code PostToolUse 훅
# 도구 호출 횟수를 추적하여 50회 도달 시, 이후 25회마다 /compact 권장 경고 출력
#
# 카운터 파일: /tmp/claude-tool-count-${PPID}
#   - PPID(부모 프로세스 PID) 기반으로 같은 세션 구분
#   - 세션 종료 시 자동 소멸 (/tmp 특성 활용)
#
# 테스트 오버라이드: COUNTER_FILE_OVERRIDE 환경변수로 카운터 파일 경로 지정 가능

# 실패해도 절대 훅을 차단하지 않음 (exit 0 보장)
trap 'exit 0' ERR

# 오류 무시 모드
set +e

# stdin에서 JSON 읽기 (PostToolUse 훅 입력)
INPUT=$(cat)

# cwd 추출 (봇 식별용)
if command -v jq &>/dev/null; then
  CWD=$(echo "$INPUT" | jq -r '.cwd // "unknown"' 2>/dev/null) || CWD="unknown"
else
  CWD=$(echo "$INPUT" | grep -o '"cwd":"[^"]*"' | head -1 | cut -d'"' -f4) || CWD="unknown"
fi

# 봇 식별 (BOT_ID 설정 - 로깅용)
if [[ -f "/home/jay/.claude/hooks/lib/detect-bot.sh" ]]; then
  # shellcheck source=/home/jay/.claude/hooks/lib/detect-bot.sh
  source /home/jay/.claude/hooks/lib/detect-bot.sh "$CWD"
else
  BOT_ID="unknown"
fi

# 카운터 파일 경로 결정
# 테스트 시 COUNTER_FILE_OVERRIDE 환경변수로 오버라이드 가능
if [[ -n "${COUNTER_FILE_OVERRIDE:-}" ]]; then
  COUNTER_FILE="$COUNTER_FILE_OVERRIDE"
else
  COUNTER_FILE="/tmp/claude-tool-count-${PPID}"
fi

# 카운터 파일이 없으면 0으로 초기화 (새 세션 시작)
if [[ ! -f "$COUNTER_FILE" ]]; then
  echo "0" > "$COUNTER_FILE" 2>/dev/null || exit 0
fi

# 현재 카운터 값 읽기
CURRENT=$(cat "$COUNTER_FILE" 2>/dev/null) || CURRENT="0"

# 숫자 유효성 검사 (숫자가 아니면 0으로 리셋)
if ! [[ "$CURRENT" =~ ^[0-9]+$ ]]; then
  CURRENT=0
fi

# 카운터 증가
NEW_COUNT=$((CURRENT + 1))

# 카운터 파일 갱신
echo "$NEW_COUNT" > "$COUNTER_FILE" 2>/dev/null || exit 0

# 경고 조건 판단:
# - 50회 도달 시 첫 경고
# - 이후 25회마다 반복 경고 (75, 100, 125, ...)
#
# 수식: NEW_COUNT >= 50 이고 (NEW_COUNT - 50) % 25 == 0
if [[ $NEW_COUNT -ge 50 ]] && [[ $(( (NEW_COUNT - 50) % 25 )) -eq 0 ]]; then
  # stderr로 경고 출력 (stdout은 훅 응답용이므로 사용 안 함)
  echo "⚠️ 도구 ${NEW_COUNT}회 호출. /compact 권장 (컨텍스트 경량화) [bot=${BOT_ID}]" >&2
fi

exit 0
