"""
git_evidence_filter.py — runtime noise 경로 필터 (단일 진실의 원천).

task-2480: daemon heartbeat / log / runtime 파일이
git_evidence verifier 의 dirty check 를 오염시키지 않도록
runtime 으로 분류해야 할 경로 패턴을 한 곳에 모아 관리한다.

Exports:
    RUNTIME_PATTERNS  — 디렉토리 prefix / 단일 파일 패턴 list
    RUNTIME_SUFFIXES  — 파일 확장자(접미사) list
    is_runtime_path(filepath) -> bool
    filter_runtime_paths(paths) -> list[str]
"""

from __future__ import annotations

# 디렉토리 prefix 또는 단일 파일 경로
RUNTIME_PATTERNS: list[str] = [
    # 디렉토리 prefix (끝에 '/' 가 있는 항목)
    "logs/",
    "memory/heartbeats/",
    "memory/events/heartbeat",  # events 디렉토리의 heartbeat* 파일만
    "memory/runtime/",
    "memory/state/",
    "memory/daily/",
    "memory/whisper/",
    "memory/logs/",
    "memory/tasks/",     # task md 파일은 실제 코드가 아님
    "memory/reports/",   # report md 는 evidence 산출물 — 검사 제외
    # 단일 파일 (정확 일치 또는 endswith("/" + pattern))
    "bot-activity.json",
    "token-ledger.json",
    "memory/pipeline-status.json",
    "memory/preview-state.json",
    "memory/merge-log.json",
    "memory/bot_settings_sync.json",
    "memory/memory-check-log.json",
    "dashboard/data/refine-status.json",
    "dashboard/data/refine-history.json",
    "memory/.task-counter",
    "memory/task-timers.json",
    "scripts/gemini_rate_tracker.json",
    "tests/coverage-report.txt",
    "memory/canary-status.json",
    "dashboard/data/medium-comments-log.json",
    "config/constants.json",
]

# 파일 확장자/접미사 (endswith)
# 회장 명시 (task-2480 §2): .done/.escalate/.qc-result 등 evidence 산출물은
# .gitignore 에서 제외 금지 — 단, verifier dirty check 상에서는 noise 로 처리해야
# 한다 (evidence 파일은 finish-task.sh 가 생성 시점에 atomic 으로 커밋되거나
# 일시적으로만 dirty 상태로 남기 때문).
RUNTIME_SUFFIXES: list[str] = [
    ".heartbeat",
    ".done",
    ".escalate",
    ".qc-result",
    ".cancelled",
    ".followup.txt",
]


def _normalize(path: str) -> str:
    """경로 separator 를 '/' 로 통일."""
    return path.replace("\\", "/")


def is_runtime_path(filepath: str) -> bool:
    """주어진 파일 경로가 runtime noise 인지 판별.

    매칭 규칙:
      - RUNTIME_SUFFIXES: normalized.endswith(suffix)
      - RUNTIME_PATTERNS:
          * 디렉토리 prefix ('/' 로 끝나거나 'memory/events/heartbeat' 같은 prefix):
              pattern in normalized  또는  normalized.startswith(pattern)
          * 단일 파일 (위 prefix 가 아닌 경우):
              normalized == pattern  또는  normalized.endswith("/" + pattern)
    """
    if not filepath:
        return False
    normalized = _normalize(filepath)

    # 1) suffix
    for suffix in RUNTIME_SUFFIXES:
        if normalized.endswith(suffix):
            return True

    # 2) patterns
    for pattern in RUNTIME_PATTERNS:
        if not pattern:
            continue
        # 디렉토리 prefix 류: '/' 로 끝나거나, 'memory/events/heartbeat' 처럼
        # heartbeat 으로 시작하는 모든 파일을 잡아야 하는 prefix
        if pattern.endswith("/") or pattern == "memory/events/heartbeat":
            if normalized.startswith(pattern) or pattern in normalized:
                return True
        else:
            # 단일 파일 패턴
            if normalized == pattern or normalized.endswith("/" + pattern):
                return True

    return False


def filter_runtime_paths(paths: list[str]) -> list[str]:
    """runtime noise 파일을 제거한 새 리스트 반환."""
    return [p for p in paths if not is_runtime_path(p)]
