"""配置管理模块。"""

import os
from pathlib import Path
from typing import Any

import yaml
from dotenv import load_dotenv
from pydantic import Field
from pydantic_settings import BaseSettings

# 先加载 .env 到环境变量
load_dotenv()


class Settings(BaseSettings):
    """应用配置。"""

    # 会话配置
    session_idle_timeout: int = Field(default=3600, description="会话空闲超时(秒)")
    session_max_per_user: int = Field(default=1, description="每用户最大会话数")
    session_max_total: int = Field(default=100, description="全局最大会话数")
    session_prefix: str = Field(default="butler_", description="会话名前缀")

    # 审批配置
    guardrail_enabled: bool = Field(default=True, description="是否启用命令审批")
    guardrail_approval_timeout: int = Field(default=300, description="审批超时(秒)")

    # 安全配置
    allowed_users: list[str] = Field(default_factory=list, description="允许的用户ID列表")

    # NapCat 配置
    napcat_ws_url: str = Field(default="ws://localhost:3001", description="NapCat WebSocket URL")
    napcat_token: str = Field(default="", description="NapCat 访问令牌")

    # Telegram 配置
    telegram_bot_token: str = Field(default="", description="Telegram Bot Token")
    telegram_allowed_chats: list[str] = Field(default_factory=list, description="允许的 Telegram 聊天 ID")

    # 启用的通道
    enabled_channels: list[str] = Field(default_factory=lambda: ["telegram"], description="启用的通道列表")

    # Inngest 配置
    inngest_event_key: str = Field(default="", description="Inngest Event Key")
    inngest_signing_key: str = Field(default="", description="Inngest Signing Key")

    # 日志配置
    log_level: str = Field(default="INFO", description="日志级别")

    # Claude API
    anthropic_api_key: str = Field(default="", description="Anthropic API Key")
    anthropic_base_url: str = Field(default="", description="Anthropic API Base URL")
    anthropic_model: str = Field(default="claude-sonnet-4-20250514", description="Claude 模型名称")

    model_config = {"env_prefix": "BUTLER_", "env_file": ".env", "extra": "ignore"}

    def is_user_allowed(self, user_id: str) -> bool:
        """检查用户是否在白名单中。"""
        if not self.allowed_users:
            return True
        return user_id in self.allowed_users


def load_config(config_path: Path | None = None) -> dict[str, Any]:
    """从 YAML 文件加载配置。"""
    if config_path is None:
        config_path = Path("config.yaml")

    if not config_path.exists():
        return {}

    with open(config_path) as f:
        return yaml.safe_load(f) or {}


def create_settings(config_path: Path | None = None) -> Settings:
    """创建配置实例，合并 YAML 和环境变量。"""
    config = load_config(config_path)
    butler_config = config.get("butler", {})

    flat_config: dict[str, Any] = {}

    session_cfg = butler_config.get("session", {})
    flat_config["session_idle_timeout"] = session_cfg.get("idle_timeout", 3600)
    flat_config["session_max_per_user"] = session_cfg.get("max_per_user", 1)
    flat_config["session_max_total"] = session_cfg.get("max_total", 100)
    flat_config["session_prefix"] = session_cfg.get("prefix", "butler_")

    guardrail_cfg = butler_config.get("guardrail", {})
    flat_config["guardrail_enabled"] = guardrail_cfg.get("enabled", True)
    flat_config["guardrail_approval_timeout"] = guardrail_cfg.get("approval_timeout", 300)

    security_cfg = butler_config.get("security", {})
    allowed = security_cfg.get("allowed_users", [])
    flat_config["allowed_users"] = allowed if allowed else []

    napcat_cfg = butler_config.get("napcat", {})
    flat_config["napcat_ws_url"] = napcat_cfg.get("ws_url", "ws://localhost:3001")
    flat_config["napcat_token"] = napcat_cfg.get("token", "")

    telegram_cfg = butler_config.get("telegram", {})
    flat_config["telegram_bot_token"] = (
        telegram_cfg.get("bot_token", "") or
        os.environ.get("TELEGRAM_BOT_TOKEN", "")
    )
    flat_config["telegram_allowed_chats"] = telegram_cfg.get("allowed_chats", [])

    channels_cfg = butler_config.get("channels", {})
    flat_config["enabled_channels"] = channels_cfg.get("enabled", ["telegram"])

    logging_cfg = butler_config.get("logging", {})
    flat_config["log_level"] = logging_cfg.get("level", "INFO")

    # Claude API - 支持多种环境变量名
    flat_config["anthropic_api_key"] = (
        butler_config.get("anthropic_api_key", "") or
        os.environ.get("ANTHROPIC_API_KEY", "") or
        os.environ.get("BUTLER_ANTHROPIC_API_KEY", "")
    )
    flat_config["anthropic_base_url"] = (
        butler_config.get("anthropic_base_url", "") or
        os.environ.get("ANTHROPIC_BASE_URL", "") or
        os.environ.get("BUTLER_ANTHROPIC_BASE_URL", "")
    )
    flat_config["anthropic_model"] = (
        butler_config.get("anthropic_model", "") or
        os.environ.get("ANTHROPIC_MODEL", "") or
        os.environ.get("BUTLER_ANTHROPIC_MODEL", "")
    )

    return Settings(**flat_config)


settings = create_settings()
