"""店铺设置 API — GET/PUT /admin/settings"""
from decimal import Decimal

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select

from app.api.deps import get_db, get_admin_user
from app.core.models.user import User
from app.core.models.tenant_settings import TenantSettings

router = APIRouter(prefix="/admin/settings", tags=["店铺设置"])


class TenantSettingsOut(BaseModel):
    store_name: str
    store_phone: str | None = None
    store_address: str | None = None
    store_description: str | None = None
    default_shipping_fee: float = 10.0
    free_shipping_threshold: float = 99.0
    notify_email: str | None = None
    payment_methods: dict | None = None
    # SMTP
    smtp_host: str | None = None
    smtp_port: int = 587
    smtp_user: str | None = None
    smtp_from_name: str | None = "SME Store"
    smtp_from_email: str | None = None
    smtp_use_tls: bool = True
    smtp_enabled: bool = False

    model_config = {"from_attributes": True}


class TenantSettingsUpdate(BaseModel):
    store_name: str | None = None
    store_phone: str | None = None
    store_address: str | None = None
    store_description: str | None = None
    default_shipping_fee: float | None = None
    free_shipping_threshold: float | None = None
    notify_email: str | None = None
    payment_methods: dict | None = None
    # SMTP
    smtp_host: str | None = None
    smtp_port: int | None = None
    smtp_user: str | None = None
    smtp_password: str | None = None
    smtp_from_name: str | None = None
    smtp_from_email: str | None = None
    smtp_use_tls: bool | None = None
    smtp_enabled: bool | None = None


def _settings_to_out(s: TenantSettings) -> TenantSettingsOut:
    return TenantSettingsOut(
        store_name=s.store_name,
        store_phone=s.store_phone,
        store_address=s.store_address,
        store_description=s.store_description,
        default_shipping_fee=float(s.default_shipping_fee),
        free_shipping_threshold=float(s.free_shipping_threshold),
        notify_email=s.notify_email,
        payment_methods=s.payment_methods,
        smtp_host=s.smtp_host or None,
        smtp_port=s.smtp_port,
        smtp_user=s.smtp_user or None,
        smtp_from_name=s.smtp_from_name or "SME Store",
        smtp_from_email=s.smtp_from_email or None,
        smtp_use_tls=bool(s.smtp_use_tls),
        smtp_enabled=bool(s.smtp_enabled),
    )


@router.get("", response_model=TenantSettingsOut, summary="获取店铺设置")
async def get_settings(
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_admin_user),
):
    """读取当前店铺设置，无记录则返回默认空配置"""
    result = await db.execute(
        select(TenantSettings).where(TenantSettings.tenant_id == current_user.tenant_id)
    )
    s = result.scalar_one_or_none()
    if not s:
        # 返回前端友好默认值
        return TenantSettingsOut(
            store_name="My Store",
            default_shipping_fee=10.0,
            free_shipping_threshold=99.0,
        )
    return _settings_to_out(s)


@router.put("", response_model=TenantSettingsOut, summary="保存店铺设置")
async def put_settings(
    body: TenantSettingsUpdate,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_admin_user),
):
    """
    保存（整体替换）店铺设置。
    使用 INSERT ... ON DUPLICATE KEY UPDATE 语法（MySQL upsert）。
    """
    data = body.model_dump(exclude_unset=True)
    if not data:
        # 空更新，直接返回当前
        result = await db.execute(
            select(TenantSettings).where(TenantSettings.tenant_id == current_user.tenant_id)
        )
        s = result.scalar_one_or_none()
        return _settings_to_out(s) if s else TenantSettingsOut(store_name="My Store", default_shipping_fee=10.0, free_shipping_threshold=99.0)

    # 检查是否已有记录
    result = await db.execute(
        select(TenantSettings).where(TenantSettings.tenant_id == current_user.tenant_id)
    )
    existing = result.scalar_one_or_none()

    if existing:
        # UPDATE
        for k, v in data.items():
            if k in ("default_shipping_fee", "free_shipping_threshold") and v is not None:
                setattr(existing, k, Decimal(str(v)))
            elif k == "smtp_port" and v is not None:
                setattr(existing, k, int(v))
            elif k in ("smtp_use_tls", "smtp_enabled"):
                setattr(existing, k, int(bool(v)))
            elif k == "smtp_password" and v is not None:
                # 密码：只更新（不返回），即使空字符串也清空
                setattr(existing, k, v)
            elif v is not None:
                setattr(existing, k, v)
        await db.commit()
        await db.refresh(existing)
        return _settings_to_out(existing)
    else:
        # INSERT
        s = TenantSettings(tenant_id=current_user.tenant_id)
        for k, v in data.items():
            if k in ("default_shipping_fee", "free_shipping_threshold") and v is not None:
                setattr(s, k, Decimal(str(v)))
            elif k == "smtp_port" and v is not None:
                setattr(s, k, int(v))
            elif k in ("smtp_use_tls", "smtp_enabled"):
                setattr(s, k, int(bool(v)))
            elif k != "smtp_password":  # 跳过 smtp_password（insert 时非必填）
                setattr(s, k, v)
        db.add(s)
        await db.commit()
        await db.refresh(s)
        return _settings_to_out(s)
