#!/usr/bin/env bash
# test_member_hook.sh: member-status hook 팀 범위 필터 기능 테스트
# Option D: 팀 범위 필터 + 워드 바운더리 검증
#
# 테스트 시나리오:
# 1. dev7 세션에서 "쿠쿨칸에게 위임" → kukulkan 매칭 (정상)
# 2. dev7 세션에서 "에라토에게 위임" → 매칭 안됨 (출판팀이므로)
# 3. publishing 세션에서 "에라토에게 위임" → erato 매칭 (정상)
# 4. unknown 세션에서 "에라토에게 위임" → erato 매칭 (하위호환)
# 5. 어떤 세션이든 "에라토스테네스의 체" → erato 매칭 안됨 (영어 워드바운더리)
# 6. dev7 세션에서 "마아트에게 QC 요청" → maat 매칭 (횡단조직)
# 7. anu 세션에서 "에라토에게 위임" → erato 매칭 (anu는 모든 팀 접근)

set -uo pipefail

HOOKS_LIB="/home/jay/.claude/hooks/lib"
PASS=0
FAIL=0

# 테스트 헬퍼
run_test() {
  local test_name="$1"
  local expected="$2"
  local actual="$3"

  if [[ "$actual" == "$expected" ]]; then
    echo "[PASS] $test_name"
    echo "       expected='$expected' actual='$actual'"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] $test_name"
    echo "       expected='$expected' actual='$actual'"
    FAIL=$((FAIL + 1))
  fi
}

# parse_member_id 로드 (캐시 포함)
source "$HOOKS_LIB/parse-member-id.sh"

# ── 테스트 1: dev7 세션에서 쿠쿨칸 매칭 ──
result=$(parse_member_id "쿠쿨칸에게 위임해주세요" "dev7")
run_test "1. dev7 세션에서 '쿠쿨칸에게 위임' → kukulkan" "kukulkan" "$result"

# ── 테스트 2: dev7 세션에서 에라토 → 매칭 안됨 ──
result=$(parse_member_id "에라토에게 위임해주세요" "dev7")
run_test "2. dev7 세션에서 '에라토에게 위임' → 빈문자열 (출판팀 멤버)" "" "$result"

# ── 테스트 3: publishing 세션에서 에라토 → 매칭 ──
result=$(parse_member_id "에라토에게 위임해주세요" "publishing")
run_test "3. publishing 세션에서 '에라토에게 위임' → erato" "erato" "$result"

# ── 테스트 4: unknown 세션에서 에라토 → 매칭 (하위호환) ──
result=$(parse_member_id "에라토에게 위임해주세요" "unknown")
run_test "4. unknown 세션에서 '에라토에게 위임' → erato (하위호환)" "erato" "$result"

# ── 테스트 5: 에라토스테네스 영어 → 매칭 안됨 (워드 바운더리) ──
# 영어 \bErato\b 워드바운더리로 Eratosthenes는 매칭 안됨
result=$(parse_member_id "Eratosthenes sieve method" "publishing")
run_test "5. publishing 세션에서 영어 'Eratosthenes' → 빈문자열 (영어 워드바운더리)" "" "$result"

# 한국어 "에라토스테네스"에서는 "에라토" 부분 매칭됨 (한국어 경계 미적용)
result2=$(parse_member_id "에라토스테네스의 체" "publishing")
run_test "5b. publishing 세션에서 '에라토스테네스의 체' → erato (한국어는 조사 포함 매칭)" "erato" "$result2"

# ── 테스트 6: dev7 세션에서 마아트 → maat 매칭 (횡단조직) ──
result=$(parse_member_id "마아트에게 QC 요청합니다" "dev7")
run_test "6. dev7 세션에서 '마아트에게 QC 요청' → maat (횡단조직)" "maat" "$result"

# ── 테스트 7: anu 세션에서 에라토 → erato 매칭 ──
result=$(parse_member_id "에라토에게 위임해주세요" "anu")
run_test "7. anu 세션에서 '에라토에게 위임' → erato (anu 모든 팀 접근)" "erato" "$result"

# ── 추가 테스트: 팀 멤버십 함수 직접 검증 ──
echo ""
echo "--- _is_team_member 직접 테스트 ---"

if declare -f _is_team_member &>/dev/null; then
  # dev7에 kukulkan
  if _is_team_member "kukulkan" "dev7"; then
    echo "[PASS] 8. kukulkan in dev7 → true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 8. kukulkan in dev7 → expected true"
    FAIL=$((FAIL + 1))
  fi

  # dev7에 erato → false
  if ! _is_team_member "erato" "dev7"; then
    echo "[PASS] 9. erato NOT in dev7 → false"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 9. erato NOT in dev7 → expected false"
    FAIL=$((FAIL + 1))
  fi

  # publishing에 erato → true
  if _is_team_member "erato" "publishing"; then
    echo "[PASS] 10. erato in publishing → true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 10. erato in publishing → expected true"
    FAIL=$((FAIL + 1))
  fi

  # unknown bot → always true
  if _is_team_member "erato" "unknown"; then
    echo "[PASS] 11. unknown bot → always true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 11. unknown bot → expected true"
    FAIL=$((FAIL + 1))
  fi

  # anu → always true
  if _is_team_member "erato" "anu"; then
    echo "[PASS] 12. anu bot → always true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 12. anu bot → expected true"
    FAIL=$((FAIL + 1))
  fi

  # cross org maat from dev7 → true
  if _is_team_member "maat" "dev7"; then
    echo "[PASS] 13. maat (cross-org) from dev7 → true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 13. maat (cross-org) from dev7 → expected true"
    FAIL=$((FAIL + 1))
  fi

  # dev1에 erato → false
  if ! _is_team_member "erato" "dev1"; then
    echo "[PASS] 14. erato NOT in dev1 → false"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 14. erato NOT in dev1 → expected false"
    FAIL=$((FAIL + 1))
  fi

  # marketing에 echo → true
  if _is_team_member "echo" "marketing"; then
    echo "[PASS] 15. echo in marketing → true"
    PASS=$((PASS + 1))
  else
    echo "[FAIL] 15. echo in marketing → expected true"
    FAIL=$((FAIL + 1))
  fi
else
  echo "[FAIL] _is_team_member function not found!"
  FAIL=$((FAIL + 1))
fi

# ── 결과 요약 ──
echo ""
echo "=============================="
echo "결과: PASS=$PASS, FAIL=$FAIL"
if [[ $FAIL -eq 0 ]]; then
  echo "모든 테스트 통과!"
  exit 0
else
  echo "일부 테스트 실패!"
  exit 1
fi
