"""集中配置：环境变量 + .env，双库连接串与目录路径。"""
import os
from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict

# 项目根目录：project-002-后端服务框架/
PROJECT_ROOT = Path(__file__).resolve().parents[3]
CODE_DIR = PROJECT_ROOT / "code"

# 运行环境：通过 APP_ENV 环境变量选择 .env 文件（dev → .env.dev，prod → .env.prod；未设置 → .env）
_APP_ENV = os.getenv("APP_ENV", "").strip().lower()
_ENV_FILE = CODE_DIR / (f".env.{_APP_ENV}" if _APP_ENV else ".env")


class Settings(BaseSettings):
    """应用配置。环境变量优先级高于 .env 文件。"""

    model_config = SettingsConfigDict(
        # 用绝对路径指向 code/.env 或 code/.env.{APP_ENV}，避免因 IDEA 工作目录不同而读不到配置
        env_file=str(_ENV_FILE),
        env_file_encoding="utf-8",
        extra="ignore",
        case_sensitive=False,
    )

    # 应用
    app_name: str = "后端服务框架"
    app_version: str = "0.1.0"
    debug: bool = False

    # 双库（源/目标）：SOURCE 为外部只读源库，TARGET 为本系统所有的目标库；未配置时回退到本地 SQLite
    source_db_url: str | None = None
    target_db_url: str | None = None
    db_pool_size: int = 5
    db_pool_recycle: int = 1800
    db_echo: bool = False

    # 目录（默认按项目结构自动定位，可用环境变量覆盖）
    data_dir: str = str(PROJECT_ROOT / "data")
    template_dir: str = str(CODE_DIR / "templates")
    output_dir: str = str(PROJECT_ROOT / "outputs")
    log_dir: str = str(PROJECT_ROOT / "logs")

    # CORS：逗号分隔；"*" 表示允许所有来源
    cors_origins: str = "*"

    # 腾讯云 OCR
    tencent_secret_id: str | None = None
    tencent_secret_key: str | None = None
    tencent_region: str = "ap-guangzhou"

    # 腾讯云 COS（对象存储）
    cos_secret_id: str | None = None
    cos_secret_key: str | None = None
    cos_region: str = "ap-guangzhou"
    cos_bucket: str | None = None
    cos_base_dir: str = "outputs"

    # PDF 转换后端：auto=先试 MS Office(COM) 失败回退 LibreOffice；msoffice=仅 COM；libreoffice=仅 LibreOffice
    pdf_converter: str = "auto"
    # LibreOffice 可执行文件：已在 PATH 时填 "soffice"，否则填绝对路径
    soffice_path: str = "soffice"

    # 占位符→字体映射：形如 "法人签名=Animal Chariot"，多个用英文逗号分隔（可扩展；需机器已安装对应字体）
    placeholder_fonts: str = "法人签名=Animal Chariot"
    # 中文字体兜底：上面的字体只作用于西文字符，中文用此字体，避免手写西文字体无中文字形
    east_asia_font: str = "华文行楷"

    # 定时 job
    job_poll_seconds: int = 60           # 有记录时轮询间隔（默认 1 分钟）
    job_empty_sleep_seconds: int = 600   # 空结果休眠秒数（默认 10 分钟）

    @property
    def cors_origin_list(self) -> list[str]:
        if self.cors_origins.strip() == "*":
            return ["*"]
        return [x.strip() for x in self.cors_origins.split(",") if x.strip()]


settings = Settings()