"""
gate_config_loader.py — gate-config.json 중앙 설정 로더

경로: __file__ 기준으로 ../config/gate-config.json 계산.
캐싱 없음: 매 호출마다 파일을 읽어 즉시 설정 변경 반영.
"""

import json
import os

_CONFIG_PATH = os.path.join(
    os.path.dirname(os.path.abspath(__file__)),
    "..",
    "config",
    "gate-config.json",
)

_VALID_MODES = {"warn", "fail"}

_DEFAULT_GATE: dict = {"enabled": False, "mode": "warn"}


def _load_raw() -> dict:
    """gate-config.json 전체를 파싱해 반환. 파일 없거나 JSON 오류 시 ValueError."""
    config_path = os.path.normpath(_CONFIG_PATH)
    try:
        with open(config_path, "r", encoding="utf-8") as f:
            data = json.load(f)
    except FileNotFoundError:
        raise ValueError(
            f"gate-config.json 파일을 찾을 수 없습니다: {config_path}"
        )
    except json.JSONDecodeError as e:
        raise ValueError(
            f"gate-config.json JSON 파싱 오류: {e}"
        )
    return data


def _validate_gate(gate_name: str, gate_cfg: dict) -> None:
    """개별 게이트 설정의 구조를 검증. 위반 시 ValueError."""
    if "enabled" in gate_cfg:
        if not isinstance(gate_cfg["enabled"], bool):
            raise ValueError(
                f"게이트 '{gate_name}'의 enabled 필드는 bool 타입이어야 합니다: "
                f"{type(gate_cfg['enabled']).__name__!r}"
            )
    if "mode" in gate_cfg:
        if gate_cfg["mode"] not in _VALID_MODES:
            raise ValueError(
                f"게이트 '{gate_name}'의 mode 필드는 'warn' 또는 'fail'이어야 합니다: "
                f"{gate_cfg['mode']!r}"
            )


def load_gate_config(gate_name: str) -> dict:
    """
    gate-config.json에서 특정 게이트 설정을 dict로 반환.
    존재하지 않는 게이트 → {"enabled": False, "mode": "warn"} 반환.
    """
    data = _load_raw()
    gates: dict = data.get("gates", {})
    gate_cfg = gates.get(gate_name)
    if gate_cfg is None:
        return dict(_DEFAULT_GATE)
    _validate_gate(gate_name, gate_cfg)
    return dict(gate_cfg)


def is_gate_enabled(gate_name: str) -> bool:
    """
    게이트 활성화 여부 반환.
    없는 게이트 → False.
    """
    cfg = load_gate_config(gate_name)
    return bool(cfg.get("enabled", False))


def get_gate_mode(gate_name: str) -> str:
    """
    게이트 모드("warn"/"fail") 반환.
    없는 게이트 → "warn".
    """
    cfg = load_gate_config(gate_name)
    return cfg.get("mode", "warn")
