"""小程序购物车合并（未登录 → 登录后）"""
from typing import List, Optional
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, get_current_customer
from app.core.models.customer import Customer
from app.core.models.product import Product, ProductVariant

router = APIRouter(tags=["小程序购物车"])


class CartMergeItem(BaseModel):
    product_id: int
    variant_id: Optional[int] = None
    quantity: int


class CartMergeIn(BaseModel):
    items: List[CartMergeItem]


@router.post("/store/mp/cart/merge", summary="合并本地购物车到服务端")
async def merge_cart(
    body: CartMergeIn,
    customer: Customer = Depends(get_current_customer),
    db: AsyncSession = Depends(get_db),
):
    results = []
    for item in body.items:
        prod_r = await db.execute(
            select(Product).where(
                Product.id == item.product_id,
                Product.tenant_id == customer.tenant_id,
            )
        )
        product = prod_r.scalar_one_or_none()
        if not product:
            continue

        variant = None
        if item.variant_id:
            var_r = await db.execute(
                select(ProductVariant).where(
                    ProductVariant.id == item.variant_id,
                    ProductVariant.product_id == item.product_id,
                )
            )
            variant = var_r.scalar_one_or_none()

        results.append({
            "product_id": item.product_id,
            "variant_id": item.variant_id,
            "quantity": item.quantity,
            "name": product.name,
            "cover_url": product.cover_url or "",
            "price": float(variant.price if variant and variant.price else product.base_price or 0),
        })

    return {"items": results, "count": len(results)}
