import json
import os
from threading import RLock

class ConfigCenter:
    """全局配置中心，单例模式，统一加载和管理配置"""
    _instance = None
    _lock = RLock()
    _config = None
    _config_path = 'config.json'

    def __new__(cls):
        if cls._instance is None:
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
                    cls._instance._load()
        return cls._instance

    def _load(self):
        """加载配置文件，缺失文件时抛出异常"""
        if not os.path.exists(self._config_path):
            raise FileNotFoundError(f"配置文件 {self._config_path} 未找到")
        with open(self._config_path, 'r', encoding='utf-8') as f:
            self._config = json.load(f)

    def get(self, path: str, default=None):
        """
        按点分隔的路径获取配置，如 'combat.base_hit_chance'
        若 default 为 None 且配置缺失，抛出 KeyError
        """
        keys = path.split('.')
        value = self._config
        for key in keys:
            if isinstance(value, dict) and key in value:
                value = value[key]
            else:
                if default is not None:
                    return default
                raise KeyError(f"配置项 {path} 不存在")
        return value
        
    def get_all(self):
        """返回完整配置的深拷贝"""
        import copy
        return copy.deepcopy(self._config)

    def reload(self):
        """热重载配置（管理员调用）"""
        with self._lock:
            self._load()

# 全局单例实例
CONFIG = ConfigCenter()