from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict

ROOT_DIR = Path(__file__).resolve().parent.parent
BACKEND_DIR = Path(__file__).resolve().parent
DEFAULT_DB_PATH = BACKEND_DIR / "data" / "agent.db"


def resolve_database_url(url: str) -> str:
    if not url.startswith("sqlite:///"):
        return url
    raw = url[len("sqlite:///") :]
    path = Path(raw)
    if not path.is_absolute():
        path = (BACKEND_DIR / path).resolve()
    path.parent.mkdir(parents=True, exist_ok=True)
    return f"sqlite:///{path.as_posix()}"


class Settings(BaseSettings):
    model_config = SettingsConfigDict(
        env_file=str(ROOT_DIR / ".env"),
        env_file_encoding="utf-8",
        extra="ignore",
    )

    deepseek_api_key: str = ""
    deepseek_model: str = "deepseek-chat"
    system_prompt: str = "你是一个友好、专业的AI助手。"
    max_history_turns: int = 20
    max_tokens: int = 4096
    web_search_enabled: bool = False
    dashscope_api_key: str = ""
    tts_model: str = "cosyvoice-v3-flash"
    tts_voice: str = "longanyang"
    database_url: str = f"sqlite:///{DEFAULT_DB_PATH.as_posix()}"


settings = Settings()
settings.database_url = resolve_database_url(settings.database_url)


def reload_settings() -> Settings:
    """重新读取 .env，原地更新 settings 对象，保证各模块引用立即生效。"""
    fresh = Settings()
    fresh.database_url = resolve_database_url(fresh.database_url)
    settings.deepseek_api_key = fresh.deepseek_api_key
    settings.deepseek_model = fresh.deepseek_model
    settings.system_prompt = fresh.system_prompt
    settings.max_history_turns = fresh.max_history_turns
    settings.max_tokens = fresh.max_tokens
    settings.web_search_enabled = fresh.web_search_enabled
    settings.dashscope_api_key = fresh.dashscope_api_key
    settings.tts_model = fresh.tts_model
    settings.tts_voice = fresh.tts_voice
    settings.database_url = fresh.database_url
    return settings
