"""Phase 4-B v1 환각 가드 단일 source — worker + 단위 테스트가 같은 정규식을 import.

GUARD_PATTERN: AI 응답 본문에서 차단해야 할 패턴.
  - %  기호 (정답률 N% 추정 위험)
  - "최근 N일" / "지난 N일" (추세 표현)
  - "X~Y 문항|개|문제" (범위 추천 — "5~10문항")
  - "N회차" (회차 카운트 추정)
  - 날짜 표현 (YYYY-MM-DD / N월 N일)

prompt 박힌 정량 정수 (`오답 1건`, `모르겠음 83건`) 는 통과.
"""

from __future__ import annotations

import re

GUARD_PATTERN = re.compile(
    r"(\d+\s*%"                                     # 정답률 16%, 50% 등
    r"|최근\s*\d+\s*일"                             # "최근 5일"
    r"|지난\s*\d+\s*일"                             # "지난 7일"
    r"|\d+\s*~\s*\d+\s*(문항|개|문제)"              # "5~10문항"
    r"|\d+\s*회차"                                  # "7회차"
    r"|\d{4}-\d{2}-\d{2}"                           # "2026-05-02"
    r"|\d+\s*월\s*\d+\s*일"                         # "5월 2일"
    r")"
)

_VALID_CONFIDENCE = {"high", "medium", "low"}
_CONFIDENCE_ORD = {"low": 0, "medium": 1, "high": 2}


def normalize_confidence(value: object) -> str:
    """모델이 'unknown'/'mid'/'maybe' 같은 비표준 값 박는 케이스 방어.

    표준 (high/medium/low) 외 값은 'low' 로 보정 (보수적).
    """
    if not isinstance(value, str):
        return "low"
    v = value.strip().lower()
    return v if v in _VALID_CONFIDENCE else "low"


def calibrate_confidence(
    confidence: object,
    *,
    ctx_docs_count: int,
    ready_explanation_count: int,
) -> str:
    """Phase 4-D: 자료 부족 토픽에서 모델이 high 박는 과신 방지.

    cap 정책 (보수적):
      - 문서 evidence 0건 + ready ai_explanation 0건  → 'low' 로 cap
      - 문서 evidence 0건 (ready ai_explanation 만 있음) → 'medium' 으로 cap
      - 그 외 (문서 evidence 1건 이상) → 모델이 박은 값 그대로

    모델이 정의보다 더 보수적인 값 박은 경우 (예: 모델 'low' 인데 cap 'medium')
    는 그대로 유지 — 더 보수적인 값을 절대 올리지 않음.
    """
    base = normalize_confidence(confidence)
    if ctx_docs_count == 0 and ready_explanation_count == 0:
        cap = "low"
    elif ctx_docs_count == 0:
        cap = "medium"
    else:
        return base
    if _CONFIDENCE_ORD[base] > _CONFIDENCE_ORD[cap]:
        return cap
    return base
