"""utils/g3_fail_classifier.py — .g3-fail 자동 분류 룰.

reconcile 전용 분류기. fail_reasons 패턴과 report 파일 mtime 비교만 사용.
사람 판정 없이 룰 기반 fail-closed.

분류:
- false_alert_resolved_by_late_report: fail_reasons에 "report not found"만 있고
  report 파일이 g3-fail 발행 후 생성됨
- unresolved: 그 외 모든 케이스 (fail-closed)
"""

from __future__ import annotations

import json
from pathlib import Path
from typing import Literal

ClassificationResult = Literal["false_alert_resolved_by_late_report", "unresolved"]


def classify_g3_fail(g3_fail_path: Path, report_path: Path) -> ClassificationResult:
    """g3-fail을 자동 분류.

    Parameters
    ----------
    g3_fail_path : Path
        ``.g3-fail`` 파일 경로 (없으면 unresolved 반환).
    report_path : Path
        대응 report 파일 경로 (예: ``memory/reports/task-XXX.md``).

    Returns
    -------
    ClassificationResult
        ``"false_alert_resolved_by_late_report"`` (reconcile 허용) 또는
        ``"unresolved"`` (fail-closed, reconcile 차단).

    동작 원칙
    ---------
    - g3_fail_path 부재 → unresolved (파일 없으면 판정 불가)
    - JSON 파싱 실패 → unresolved (fail-closed)
    - fail_reasons 빈 리스트 → unresolved
    - 모든 fail_reason에 "report not found" 포함 AND report 파일이
      g3-fail 발행 이후 생성되었으면 → false_alert_resolved_by_late_report
    - 그 외 → unresolved
    """
    if not g3_fail_path.exists():
        return "unresolved"

    try:
        payload = json.loads(g3_fail_path.read_text(encoding="utf-8"))
    except (json.JSONDecodeError, OSError):
        return "unresolved"

    fail_reasons = payload.get("fail_reasons", [])
    if not isinstance(fail_reasons, list) or not fail_reasons:
        return "unresolved"

    # 케이스 1: 모든 fail_reason이 "report not found" 패턴
    if all(isinstance(r, str) and "report not found" in r for r in fail_reasons):
        if report_path.exists():
            try:
                report_mtime = report_path.stat().st_mtime
                g3_mtime = g3_fail_path.stat().st_mtime
                if report_mtime > g3_mtime:
                    return "false_alert_resolved_by_late_report"
            except OSError:
                pass

    return "unresolved"
