"""Feature Flag 로더 모듈.

.claude/feature_flags.json을 읽고 플래그 상태를 관리한다.

Usage:
    from utils.feature_flags import FeatureFlagLoader
    flags = FeatureFlagLoader()
    if flags.is_enabled("progressive_disclosure_enabled"):
        ...
"""

import json
import logging
import os
import tempfile
from datetime import datetime, timedelta, timezone

logger = logging.getLogger(__name__)

KST = timezone(timedelta(hours=9))


class FeatureFlagLoader:
    """Feature flag 로더. mtime 캐시 + atomic write."""

    def __init__(self, path: str = ".claude/feature_flags.json"):
        # 절대 경로 변환: WORKSPACE_ROOT 기준
        if not os.path.isabs(path):
            workspace = os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace")
            path = os.path.join(workspace, path)
        self._path = path
        self._cache: dict = {}
        self._mtime: float = 0.0
        self._load()

    def _load(self) -> None:
        """파일 로드. 실패 시 이전 캐시 유지."""
        try:
            with open(self._path, "r", encoding="utf-8") as f:
                self._cache = json.load(f)
            self._mtime = os.path.getmtime(self._path)
        except FileNotFoundError:
            logger.warning("Feature flags 파일 없음: %s — 모든 플래그 false 처리", self._path)
            self._cache = {"flags": {}}
        except json.JSONDecodeError:
            logger.warning("Feature flags JSON 파싱 실패: %s — 이전 캐시 유지", self._path)

    def reload(self) -> None:
        """파일 mtime 확인 후 변경된 경우에만 재로드."""
        try:
            current_mtime = os.path.getmtime(self._path)
        except FileNotFoundError:
            return
        if current_mtime != self._mtime:
            self._load()

    def is_enabled(self, flag_name: str) -> bool:
        """플래그 활성화 여부 반환. 존재하지 않는 플래그는 False."""
        self.reload()
        flags = self._cache.get("flags", {})
        if flag_name not in flags:
            logger.warning("알 수 없는 플래그: %s — False 반환", flag_name)
            return False
        return bool(flags[flag_name])

    def set_flag(self, flag_name: str, value: bool) -> None:
        """atomic write로 플래그 값 변경. updated_at 자동 갱신."""
        self.reload()
        flags = self._cache.get("flags", {})
        flags[flag_name] = value
        self._cache["flags"] = flags
        self._cache["updated_at"] = datetime.now(KST).isoformat()
        self._atomic_write(self._cache)
        self._mtime = os.path.getmtime(self._path)

    def _atomic_write(self, data: dict) -> None:
        """atomic write: tempfile → os.replace 패턴."""
        dir_path = os.path.dirname(self._path)
        os.makedirs(dir_path, exist_ok=True)
        with tempfile.NamedTemporaryFile(mode="w", dir=dir_path, delete=False, suffix=".tmp") as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
            tmp_path = f.name
        os.replace(tmp_path, self._path)

    def get_all_flags(self) -> dict:
        """모든 플래그 상태 반환."""
        self.reload()
        return dict(self._cache.get("flags", {}))
