"""全局配置，从 .env 文件读取"""
from pydantic_settings import BaseSettings
from functools import lru_cache


class Settings(BaseSettings):
    # 应用
    APP_ENV: str = "development"
    SECRET_KEY: str = "change-me"
    DEBUG: bool = True

    # MySQL
    DB_HOST: str = "localhost"
    DB_PORT: int = 3306
    DB_NAME: str = "sme_omnistore"
    DB_USER: str = "sme_user"
    DB_PASSWORD: str = "sme_pass123"
    DB_POOL_SIZE: int = 10
    DB_MAX_OVERFLOW: int = 20

    # Redis
    REDIS_HOST: str = "localhost"
    REDIS_PORT: int = 6379
    REDIS_DB: int = 0
    REDIS_PASSWORD: str = ""

    # 默认租户 ID（单租户部署时使用，可通过 .env 覆盖）
    DEFAULT_TENANT_ID: int = 2

    # CDN 存储插件（local / s3 / r2 / oss）
    CDN_PROVIDER: str = "local"        # local | s3 | r2 | oss
    CDN_PUBLIC_URL: str = ""           # 公开访问域名前缀，如 https://cdn.example.com
    # AWS S3 / Lightsail / Cloudflare R2
    CDN_S3_BUCKET: str = ""
    CDN_S3_REGION: str = "us-east-1"
    CDN_S3_ACCESS_KEY: str = ""
    CDN_S3_SECRET_KEY: str = ""
    CDN_S3_ENDPOINT_URL: str = ""      # 自定义 endpoint（Lightsail 留空，走标准 S3）
    CDN_S3_USE_ACL: str = "false"      # Lightsail/R2 设 false；标准 S3 公共桶设 true
    CDN_R2_ENDPOINT: str = ""          # R2 endpoint: https://<account>.r2.cloudflarestorage.com
    # 阿里云 OSS
    CDN_OSS_BUCKET: str = ""
    CDN_OSS_ENDPOINT: str = ""         # e.g. oss-cn-shanghai.aliyuncs.com
    CDN_OSS_ACCESS_KEY: str = ""
    CDN_OSS_SECRET_KEY: str = ""

    # 初始租户（install.py 使用）
    INIT_TENANT_NAME: str = "SME Demo Store"
    INIT_TENANT_DOMAIN: str = "localhost"
    INIT_ADMIN_EMAIL: str = "admin@example.com"
    INIT_ADMIN_PASSWORD: str = "Admin@2026!"
    ADMIN_CORS_ORIGINS: str = (
        "http://localhost:3001,http://localhost:3002,"
        "https://www.aulewin.com,https://aulewin.com,"
        "https://api.largeswan.com"
    )
    API_BASE_URL: str = "http://localhost:8000"
    FRONTEND_URL: str = "http://localhost:3000"

    # POS 配对（SuperAdmin pairing）
    POS_PUBLIC_API_BASE_URL: str = ""                        # 返回给 Agent 的云端 API 基址，必须含 /api，如 https://host/api
    POS_AGENT_ALLOWED_ORIGIN: str = "http://127.0.0.1:5177"  # POS 渲染端本地 origin

    # 内置 SearXNG 端点（联网搜索 / 商品图片）。如 http://127.0.0.1:8888；
    # 留空则回退到公共实例列表。见 deploy/searxng/README.md
    SEARXNG_URL: str = ""

    @property
    def DATABASE_URL(self) -> str:
        """异步连接串（aiomysql）"""
        return (
            f"mysql+aiomysql://{self.DB_USER}:{self.DB_PASSWORD}"
            f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
            f"?charset=utf8mb4"
        )

    @property
    def DATABASE_URL_SYNC(self) -> str:
        """同步连接串（pymysql，用于 Alembic / install.py）"""
        return (
            f"mysql+pymysql://{self.DB_USER}:{self.DB_PASSWORD}"
            f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
            f"?charset=utf8mb4"
        )

    @property
    def REDIS_URL(self) -> str:
        if self.REDIS_PASSWORD:
            return f"redis://:{self.REDIS_PASSWORD}@{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}"
        return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}"

    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"
        extra = "ignore"


@lru_cache()
def get_settings() -> Settings:
    return Settings()


settings = get_settings()
