"""DQ (Design Quality) 규칙 단일 소스 모듈.

모든 디자인 품질 규칙은 memory/specs/dq-rules.json에서 로드.
이 모듈을 통해서만 DQ 규칙에 접근할 것.

사용법:
    from dq_rules import DQ_RULES, get_font_rule, check_font_size, validate_font_sizes

    # 규칙 직접 접근
    headline_min = DQ_RULES["font_sizes"]["headline"]["min"]  # 84

    # 역할별 폰트 규칙 조회
    rule = get_font_rule("헤드라인")  # {"min_px": 84, "min_weight": 800, ...}

    # 단일 폰트 크기 검증
    ok, msg = check_font_size("헤드라인", 68)  # (False, "헤드라인 최소 84px 위반: 68px")

    # HTML/CSS에서 폰트 크기 전체 검증
    errors = validate_font_sizes(html_content)
"""

import json
from pathlib import Path

# ── 단일 소스 로드 ──

_RULES_PATH = Path(__file__).resolve().parent.parent / "memory" / "specs" / "dq-rules.json"


def _load_rules() -> dict:
    """dq-rules.json에서 규칙을 로드."""
    with open(_RULES_PATH, encoding="utf-8") as f:
        return json.load(f)


DQ_RULES = _load_rules()

# ── 편의 상수 ──

ABSOLUTE_MIN_PX = DQ_RULES["font_sizes"]["absolute_min"]
MIN_FONT_FAMILIES = DQ_RULES["font_pairing"]["min_families"]
BANNED_FONTS = set(DQ_RULES["font_pairing"]["banned_fonts"])
PASS_THRESHOLD = DQ_RULES["dq_scoring"]["pass_threshold"]
MAX_ELEMENTS_PER_SLIDE = DQ_RULES["text_density"]["max_elements_per_slide"]
MAX_WORDS_PER_SLIDE = DQ_RULES["text_density"]["max_words_per_slide"]

# 역할명 → font_sizes 키 매핑
_ROLE_KEY_MAP = {
    "핵심 수치": "core_metric",
    "핵심수치": "core_metric",
    "숫자 강조": "core_metric",
    "헤드라인": "headline",
    "메인 카피": "headline",
    "메인카피": "headline",
    "서브헤드": "subhead",
    "서브 카피": "subhead",
    "서브카피": "subhead",
    "본문": "subhead",
    "CTA": "cta",
    "cta": "cta",
    "버튼": "cta",
    "면책": "disclaimer",
    "최소": "disclaimer",
}


def get_font_rule(role: str) -> dict | None:
    """역할명으로 폰트 규칙을 조회.

    Returns:
        {"min_px": int, "min_weight": int, "max_weight": int, "key": str} or None
    """
    key = _ROLE_KEY_MAP.get(role)
    if not key:
        return None

    size = DQ_RULES["font_sizes"].get(key)
    weight = DQ_RULES["font_weights"].get(key)
    if not size or not weight:
        return None

    return {
        "key": key,
        "min_px": size["min"],
        "min_weight": weight["min"],
        "max_weight": weight["max"],
    }


def get_all_font_rules() -> dict:
    """모든 역할의 폰트 규칙을 반환.

    Returns:
        {"헤드라인": {"min_px": 84, ...}, "서브헤드": {...}, ...}
    """
    seen_keys = set()
    result = {}
    for role, key in _ROLE_KEY_MAP.items():
        if key in seen_keys:
            continue
        seen_keys.add(key)
        rule = get_font_rule(role)
        if rule:
            # 가장 대표적인 한글 이름 사용
            label = next(r for r, k in _ROLE_KEY_MAP.items() if k == key)
            result[label] = rule
    return result


def check_font_size(role: str, px: int) -> tuple[bool, str]:
    """단일 폰트 크기를 역할 기준으로 검증.

    Returns:
        (passed: bool, message: str)
    """
    # 절대 최소 체크
    if px < ABSOLUTE_MIN_PX:
        return False, f"40px 미만 절대 금지 위반: {px}px"

    rule = get_font_rule(role)
    if not rule:
        return True, "OK (역할 미식별)"

    if px < rule["min_px"]:
        return False, f"{role} 최소 {rule['min_px']}px 위반: {px}px"

    return True, "OK"


def get_auto_fail_rules() -> list[str]:
    """DQ 평가 시 자동 FAIL 규칙 목록 반환."""
    return DQ_RULES["dq_scoring"]["auto_fail_rules"]


def get_dq_items() -> dict:
    """DQ 10항목 정보 반환."""
    return DQ_RULES["dq_scoring"]["items"]


def rules_version() -> str:
    """현재 규칙 버전 반환."""
    return DQ_RULES["_meta"]["version"]


def rules_path() -> str:
    """규칙 파일 경로 반환."""
    return str(_RULES_PATH)


# ── CLI 사용 ──

if __name__ == "__main__":
    import sys

    if len(sys.argv) > 1 and sys.argv[1] == "summary":
        print(f"DQ Rules v{rules_version()} — {rules_path()}")
        print(f"PASS 기준: {PASS_THRESHOLD}점+")
        print(f"절대 최소: {ABSOLUTE_MIN_PX}px")
        print(f"폰트 최소 종류: {MIN_FONT_FAMILIES}")
        print()
        for role, rule in get_all_font_rules().items():
            print(f"  {role}: {rule['min_px']}px+, weight {rule['min_weight']}-{rule['max_weight']}")
        print()
        print("자동 FAIL 규칙:")
        for r in get_auto_fail_rules():
            print(f"  - {r}")
    else:
        print("사용법: python3 dq_rules.py summary")
        print("       from dq_rules import DQ_RULES, get_font_rule, check_font_size")
