"""前台优惠券验证路由"""
from datetime import datetime, timezone
from typing import Optional
from decimal import Decimal

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

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

router = APIRouter(prefix="/store/coupons", tags=["前台优惠券"])

_TYPE_LABEL = {
    "order_amount_off":    "满减券",
    "order_percent_off":   "折扣券",
    "product_amount_off":  "商品立减券",
    "product_buyxgety":    "买赠券",
    "category_percent_off":"分类折扣券",
    "free_shipping":       "免运费券",
    "points_multiplier":   "积分加倍券",
    # backward compat aliases
    "fixed":               "满减券",
    "percentage":          "折扣券",
    "buy_x_get_y":         "买赠券",
}


class ValidateIn(BaseModel):
    code:         str
    order_amount: float


class CouponResult(BaseModel):
    id:           int
    code:         str
    name:         str
    type:         str
    value:        float
    min_amount:   float
    discount:     float


@router.post("/validate", response_model=CouponResult, summary="验证优惠券码（公开）")
async def validate_coupon(
    body:     ValidateIn,
    tid:      int = Depends(get_tenant_by_domain),
    customer: Optional[Customer] = Depends(get_optional_customer),
    db:       AsyncSession = Depends(get_db),
):
    eff_tenant = tid

    now = datetime.now(timezone.utc)
    r = await db.execute(
        select(Discount).where(
            Discount.code == body.code.upper(),
            Discount.tenant_id == eff_tenant,
            Discount.is_active == 1,
            or_(Discount.start_at.is_(None), Discount.start_at <= now),
            or_(Discount.end_at.is_(None), Discount.end_at >= now),
        )
    )
    coupon = r.scalar_one_or_none()

    if not coupon:
        raise HTTPException(status_code=404, detail="优惠券无效、不存在或已过期")

    if coupon.usage_limit and coupon.used_count >= coupon.usage_limit:
        raise HTTPException(status_code=400, detail="该优惠券已被领完")

    amount = Decimal(str(body.order_amount))
    if coupon.min_order_amount and amount < coupon.min_order_amount:
        raise HTTPException(
            status_code=400,
            detail=f"该券需满 ¥{coupon.min_order_amount} 方可使用，当前 ¥{amount:.2f}",
        )

    # 计算预估减免（简单估算，实际以下单时促销引擎结果为准）
    ntype = coupon.normalized_type
    if ntype == "order_amount_off":
        discount = float(min(coupon.value, amount))
    elif ntype == "order_percent_off":
        discount = float(amount * coupon.value / Decimal("100"))
    elif ntype == "free_shipping":
        discount = 10.0  # 运费估算
    else:
        discount = 0.0

    type_label = _TYPE_LABEL.get(coupon.type, coupon.type)
    display_name = coupon.name if coupon.name else f"{type_label}（{coupon.code}）"

    return CouponResult(
        id=coupon.id,
        code=coupon.code or "",
        name=display_name,
        type=coupon.type,
        value=float(coupon.value),
        min_amount=float(coupon.min_order_amount or 0),
        discount=round(discount, 2),
    )
