#!/usr/bin/env python3
"""pre-commit hook: feedback_*.md 신규 작성 시 MEMORY.md ★ 마커 등록 검증.

사용:
  python3 scripts/hooks/pre-commit-memory-check.py
  SKIP_MEMORY_CHECK=1 python3 scripts/hooks/pre-commit-memory-check.py  # 우회

종료 코드:
  0: 검사 통과 (또는 SKIP_MEMORY_CHECK=1)
  1: 미등록 feedback 파일 발견
"""
import os
import re
import subprocess
import sys
from pathlib import Path

WORKSPACE = Path(os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace"))
ANU_MEMORY_DIR = Path(os.environ.get(
    "MEMORY_CHECK_FEEDBACK_DIR",
    str(Path.home() / ".claude" / "projects" / "-home-jay--cokacdir-workspace-autoset" / "memory")
))
WS_MEMORY = WORKSPACE / "memory" / "MEMORY.md"
ANU_MEMORY = ANU_MEMORY_DIR / "MEMORY.md"

FEEDBACK_PATTERN = re.compile(r"^(feedback|bug)_[A-Za-z0-9_]+\.md$")
TEST_EXCLUDE_PATTERN = re.compile(r"^(feedback|bug)_test_")


def get_staged_files() -> list[str]:
    """git diff --cached로 ACM (added/copied/modified) 파일 목록 반환."""
    try:
        result = subprocess.run(
            ["git", "diff", "--cached", "--name-only", "--diff-filter=ACM"],
            capture_output=True, text=True, check=True, cwd=str(WORKSPACE),
        )
        return [f.strip() for f in result.stdout.splitlines() if f.strip()]
    except Exception:
        return []


def is_feedback_file(filepath: str) -> bool:
    """feedback_*.md 또는 bug_*.md 패턴 매칭 (test 제외)."""
    name = os.path.basename(filepath)
    if TEST_EXCLUDE_PATTERN.match(name):
        return False
    return bool(FEEDBACK_PATTERN.match(name))


def is_registered_in_memory(filename: str, memory_paths: list[Path]) -> bool:
    """파일명이 MEMORY.md 중 하나에 ★ 마커가 있는 라인에 등록됐는지 확인.

    파일명 stem (확장자 제외) 또는 전체 파일명이 ★ 라인에 포함되면 등록된 것으로 간주.
    """
    stem = os.path.basename(filename).replace(".md", "")
    for mem_path in memory_paths:
        if not mem_path.exists():
            continue
        try:
            content = mem_path.read_text(encoding="utf-8")
            for line in content.splitlines():
                if "★" not in line:
                    continue
                if stem in line or filename in line or os.path.basename(filename) in line:
                    return True
        except Exception:
            continue
    return False


def main() -> int:
    if os.environ.get("SKIP_MEMORY_CHECK") == "1":
        return 0

    staged = get_staged_files()
    feedback_files = [f for f in staged if is_feedback_file(f)]

    if not feedback_files:
        return 0

    memory_paths = [WS_MEMORY, ANU_MEMORY]
    unregistered = []
    for f in feedback_files:
        if not is_registered_in_memory(f, memory_paths):
            unregistered.append(f)

    if unregistered:
        print("\n[memory-check] 신규/수정 feedback 파일 중 MEMORY.md ★ 마커 미등록:", file=sys.stderr)
        for f in unregistered:
            print(f"   - {f}", file=sys.stderr)
        print("\n해결:", file=sys.stderr)
        print("  1. memory/MEMORY.md 또는 안누 MEMORY.md에 ★ 마커로 인덱싱 추가", file=sys.stderr)
        print("  2. 또는 긴급 우회: SKIP_MEMORY_CHECK=1 git commit ...", file=sys.stderr)
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())
