#!/usr/bin/env bash
# test_strategic_compact.sh: strategic-compact.sh 훅 테스트
# TDD 방식 - 훅 구현 전 먼저 작성

# 테스트 설정
HOOK_PATH="/home/jay/workspace/hooks/strategic-compact.sh"
PASS=0
FAIL=0

# 색상 코드
GREEN='\033[0;32m'
RED='\033[0;31m'
RESET='\033[0m'

# 테스트 헬퍼
pass() {
  echo -e "${GREEN}[PASS]${RESET} $1"
  ((PASS++))
}

fail() {
  echo -e "${RED}[FAIL]${RESET} $1"
  echo "       $2"
  ((FAIL++))
}

# 훅 호출 헬퍼: 카운터 파일 경로를 테스트용으로 오버라이드
# COUNTER_FILE_OVERRIDE 환경변수로 카운터 파일 경로 지정
call_hook() {
  local json='{"tool_name":"Bash","cwd":"/home/jay/.cokacdir/workspace/dev4","session_id":"test-session"}'
  echo "$json" | COUNTER_FILE_OVERRIDE="$TEST_COUNTER_FILE" bash "$HOOK_PATH" 2>"$TEST_STDERR_FILE"
  return $?
}

# 각 테스트 전 임시 파일 초기화
setup() {
  TEST_COUNTER_FILE=$(mktemp /tmp/test-claude-tool-count-XXXXXX)
  TEST_STDERR_FILE=$(mktemp /tmp/test-stderr-XXXXXX)
  # 카운터 파일 삭제하여 "없는" 상태 시뮬레이션
  rm -f "$TEST_COUNTER_FILE"
}

teardown() {
  rm -f "$TEST_COUNTER_FILE" "$TEST_STDERR_FILE"
}

# ─────────────────────────────────────────────
# 테스트 1: 카운터 파일이 없으면 생성되고 값=1
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 1: 카운터 파일 미존재 시 생성 및 값=1 ==="
setup
call_hook
EXIT_CODE=$?

if [[ -f "$TEST_COUNTER_FILE" ]]; then
  COUNT=$(cat "$TEST_COUNTER_FILE")
  if [[ "$COUNT" == "1" ]]; then
    pass "카운터 파일 생성됨, 값=1"
  else
    fail "카운터 파일 생성됨, 값 오류" "기대값=1, 실제값=$COUNT"
  fi
else
  fail "카운터 파일이 생성되지 않음" "파일 없음: $TEST_COUNTER_FILE"
fi

if [[ $EXIT_CODE -eq 0 ]]; then
  pass "exit 0 반환"
else
  fail "exit 0 반환 실패" "exit code=$EXIT_CODE"
fi
teardown

# ─────────────────────────────────────────────
# 테스트 2: 49회 호출 시 경고 없음 (exit 0, stderr 비어있음)
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 2: 49회 호출 시 경고 없음 ==="
setup
# 카운터를 48로 설정 (49번째 호출 시뮬레이션)
echo "48" > "$TEST_COUNTER_FILE"
call_hook
EXIT_CODE=$?

STDERR_CONTENT=$(cat "$TEST_STDERR_FILE")
COUNT=$(cat "$TEST_COUNTER_FILE" 2>/dev/null)

if [[ $EXIT_CODE -eq 0 ]]; then
  pass "49회 호출 시 exit 0"
else
  fail "49회 호출 시 exit 0 실패" "exit code=$EXIT_CODE"
fi

if [[ -z "$STDERR_CONTENT" ]]; then
  pass "49회 호출 시 stderr 비어있음"
else
  fail "49회 호출 시 stderr에 내용 존재" "stderr: $STDERR_CONTENT"
fi

if [[ "$COUNT" == "49" ]]; then
  pass "카운터 값=49"
else
  fail "카운터 값 오류" "기대값=49, 실제값=$COUNT"
fi
teardown

# ─────────────────────────────────────────────
# 테스트 3: 50회 호출 시 stderr에 경고 포함
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 3: 50회 호출 시 경고 출력 ==="
setup
# 카운터를 49로 설정 (50번째 호출 시뮬레이션)
echo "49" > "$TEST_COUNTER_FILE"
call_hook
EXIT_CODE=$?

STDERR_CONTENT=$(cat "$TEST_STDERR_FILE")
COUNT=$(cat "$TEST_COUNTER_FILE" 2>/dev/null)

if [[ $EXIT_CODE -eq 0 ]]; then
  pass "50회 호출 시 exit 0"
else
  fail "50회 호출 시 exit 0 실패" "exit code=$EXIT_CODE"
fi

if echo "$STDERR_CONTENT" | grep -q "⚠️ 도구 50회 호출"; then
  pass "50회 호출 시 stderr에 '⚠️ 도구 50회 호출' 포함"
else
  fail "50회 호출 시 경고 메시지 없음" "stderr: $STDERR_CONTENT"
fi

if [[ "$COUNT" == "50" ]]; then
  pass "카운터 값=50"
else
  fail "카운터 값 오류" "기대값=50, 실제값=$COUNT"
fi
teardown

# ─────────────────────────────────────────────
# 테스트 4: 51~74회 호출 시 경고 없음
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 4: 51~74회 호출 시 경고 없음 ==="
setup

# 51회 테스트
echo "50" > "$TEST_COUNTER_FILE"
call_hook
STDERR_51=$(cat "$TEST_STDERR_FILE")

# 74회 테스트
echo "73" > "$TEST_COUNTER_FILE"
call_hook
STDERR_74=$(cat "$TEST_STDERR_FILE")

if [[ -z "$STDERR_51" ]]; then
  pass "51회 호출 시 stderr 비어있음"
else
  fail "51회 호출 시 stderr에 내용 존재" "stderr: $STDERR_51"
fi

if [[ -z "$STDERR_74" ]]; then
  pass "74회 호출 시 stderr 비어있음"
else
  fail "74회 호출 시 stderr에 내용 존재" "stderr: $STDERR_74"
fi
teardown

# ─────────────────────────────────────────────
# 테스트 5: 75회 호출 시 stderr에 경고 포함
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 5: 75회 호출 시 경고 출력 ==="
setup
# 카운터를 74로 설정 (75번째 호출 시뮬레이션)
echo "74" > "$TEST_COUNTER_FILE"
call_hook
EXIT_CODE=$?

STDERR_CONTENT=$(cat "$TEST_STDERR_FILE")
COUNT=$(cat "$TEST_COUNTER_FILE" 2>/dev/null)

if [[ $EXIT_CODE -eq 0 ]]; then
  pass "75회 호출 시 exit 0"
else
  fail "75회 호출 시 exit 0 실패" "exit code=$EXIT_CODE"
fi

if echo "$STDERR_CONTENT" | grep -q "⚠️ 도구 75회 호출"; then
  pass "75회 호출 시 stderr에 '⚠️ 도구 75회 호출' 포함"
else
  fail "75회 호출 시 경고 메시지 없음" "stderr: $STDERR_CONTENT"
fi

if [[ "$COUNT" == "75" ]]; then
  pass "카운터 값=75"
else
  fail "카운터 값 오류" "기대값=75, 실제값=$COUNT"
fi
teardown

# ─────────────────────────────────────────────
# 테스트 6: 훅 실패 시에도 exit 0 반환
# ─────────────────────────────────────────────
echo ""
echo "=== 테스트 6: 훅 실패 시 exit 0 보장 ==="
setup
# 읽기 전용 디렉토리에 카운터 파일을 만들어 쓰기 실패 유발
READONLY_DIR=$(mktemp -d /tmp/test-readonly-XXXXXX)
chmod 555 "$READONLY_DIR"
READONLY_COUNTER="$READONLY_DIR/counter"

EXIT_CODE_FAIL=$(echo '{"tool_name":"Bash","cwd":"/tmp","session_id":"test"}' | \
  COUNTER_FILE_OVERRIDE="$READONLY_COUNTER" bash "$HOOK_PATH" 2>/dev/null; echo $?)

chmod 755 "$READONLY_DIR"
rm -rf "$READONLY_DIR"

if [[ "$EXIT_CODE_FAIL" == "0" ]]; then
  pass "쓰기 실패 시에도 exit 0 반환"
else
  fail "쓰기 실패 시 exit 0 반환 실패" "exit code=$EXIT_CODE_FAIL"
fi
teardown

# ─────────────────────────────────────────────
# 최종 결과
# ─────────────────────────────────────────────
echo ""
echo "============================================"
echo "테스트 결과: PASS=${PASS}, FAIL=${FAIL}"
echo "============================================"

if [[ $FAIL -eq 0 ]]; then
  echo -e "${GREEN}모든 테스트 통과!${RESET}"
  exit 0
else
  echo -e "${RED}${FAIL}개 테스트 실패${RESET}"
  exit 1
fi
