"""前台促销活动查询路由"""
from datetime import datetime, timezone
from typing import Optional
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, or_

from app.api.deps import get_db, get_tenant_by_domain
from app.core.models.discount import Discount

router = APIRouter(prefix="/store/promotions", tags=["前台促销"])

_TYPE_LABEL = {
    "order_amount_off": "amount_off",
    "order_percent_off": "percent_off",
    "product_amount_off": "product_off",
    "product_buyxgety": "buyxgety",
    "category_percent_off": "category_off",
    "free_shipping": "free_shipping",
    "points_multiplier": "points",
    "fixed": "amount_off",
    "percentage": "percent_off",
    "buy_x_get_y": "buyxgety",
}


class PromotionSummary(BaseModel):
    id: int
    name: str
    rule_type: str
    value: float
    min_order_amount: Optional[float] = None
    condition_min_qty: Optional[int] = None
    condition_product_ids: Optional[list] = None
    condition_category_ids: Optional[list] = None
    discount_product_ids: Optional[list] = None
    discount_qty: Optional[int] = None
    start_at: Optional[datetime] = None
    end_at: Optional[datetime] = None
    hint: str


def _build_hint(d: Discount) -> str:
    """根据规则类型生成简短的促销提示"""
    rt = d.normalized_type
    if rt == "product_buyxgety":
        buy = d.condition_min_qty or 1
        get = d.discount_qty or 1
        return f"Buy {buy} Get {get} Free"
    elif rt == "order_amount_off":
        if d.min_order_amount:
            return f"${d.value:.0f} off orders over ${d.min_order_amount:.0f}"
        return f"${d.value:.0f} off"
    elif rt == "order_percent_off":
        if d.min_order_amount:
            return f"{d.value:.0f}% off orders over ${d.min_order_amount:.0f}"
        return f"{d.value:.0f}% off"
    elif rt == "product_amount_off":
        return f"${d.value:.0f} off selected items"
    elif rt == "category_percent_off":
        return f"{d.value:.0f}% off selected categories"
    elif rt == "free_shipping":
        return "Free shipping"
    elif rt == "points_multiplier":
        return f"{d.points_multiplier or 2}x points"
    return d.name or "Special offer"


@router.get("/active", response_model=list[PromotionSummary], summary="当前生效的自动促销列表")
async def list_active_promotions(
    tid: int = Depends(get_tenant_by_domain),
    db: AsyncSession = Depends(get_db),
):
    now = datetime.now(timezone.utc)
    result = await db.execute(
        select(Discount).where(
            Discount.tenant_id == tid,
            Discount.is_active == 1,
            Discount.code.is_(None),
            or_(Discount.start_at.is_(None), Discount.start_at <= now),
            or_(Discount.end_at.is_(None), Discount.end_at >= now),
        ).order_by(Discount.priority.desc())
    )
    promos = result.scalars().all()

    return [
        PromotionSummary(
            id=p.id,
            name=p.name or f"Promotion #{p.id}",
            rule_type=_TYPE_LABEL.get(p.type, p.type),
            value=float(p.value),
            min_order_amount=float(p.min_order_amount) if p.min_order_amount else None,
            condition_min_qty=p.condition_min_qty,
            condition_product_ids=p.condition_product_ids,
            condition_category_ids=p.condition_category_ids,
            discount_product_ids=p.discount_product_ids,
            discount_qty=p.discount_qty,
            start_at=p.start_at,
            end_at=p.end_at,
            hint=_build_hint(p),
        )
        for p in promos
    ]
