"""客户管理路由"""
from typing import Optional
from decimal import Decimal
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func, or_

from app.api.deps import get_db, get_admin_user
from app.core.models.user import User
from app.core.models.customer import Customer
from app.core.models.order import Order
from app.schemas.common import PageResult
from app.schemas.customer import CustomerOut

router = APIRouter(prefix="/customers", tags=["客户管理"])


@router.get("", response_model=PageResult[CustomerOut], summary="客户列表")
async def list_customers(
    page: int = Query(1, ge=1),
    page_size: int = Query(10, ge=1, le=100),
    keyword: Optional[str] = None,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_admin_user),
):
    tid = current_user.tenant_id
    q = select(Customer).where(Customer.tenant_id == tid)

    if keyword:
        q = q.where(or_(
            Customer.name.ilike(f"%{keyword}%"),
            Customer.email.ilike(f"%{keyword}%"),
            Customer.phone.ilike(f"%{keyword}%"),
        ))

    total_r = await db.execute(select(func.count()).select_from(q.subquery()))
    total = total_r.scalar() or 0

    q = q.order_by(Customer.created_at.desc()).offset((page - 1) * page_size).limit(page_size)
    result = await db.execute(q)
    customers = result.scalars().all()

    items = []
    for c in customers:
        # Count orders
        cnt_r = await db.execute(
            select(func.count(Order.id)).where(
                Order.customer_id == c.id,
                Order.tenant_id == tid,
            )
        )
        orders_count = cnt_r.scalar() or 0

        # Sum total spent (completed/paid orders)
        spent_r = await db.execute(
            select(func.coalesce(func.sum(Order.grand_total), 0)).where(
                Order.customer_id == c.id,
                Order.tenant_id == tid,
                Order.status.in_(["paid", "shipped", "completed"]),
            )
        )
        total_spent = spent_r.scalar() or Decimal("0")

        # Derive membership tier
        if total_spent >= Decimal("10000"):
            tier = "platinum"
        elif total_spent >= Decimal("5000"):
            tier = "gold"
        elif total_spent >= Decimal("1000"):
            tier = "silver"
        else:
            tier = "regular"

        items.append(CustomerOut(
            id=c.id,
            name=c.name or "",
            email=c.email or "",
            phone=c.phone or "",
            orders_count=orders_count,
            total_spent=total_spent,
            membership_tier=tier,
            created_at=c.created_at,
        ))

    return PageResult(items=items, total=total, page=page, page_size=page_size)


@router.get("/{customer_id}", response_model=CustomerOut, summary="客户详情")
async def get_customer(
    customer_id: int,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_admin_user),
):
    r = await db.execute(
        select(Customer).where(
            Customer.id == customer_id,
            Customer.tenant_id == current_user.tenant_id,
        )
    )
    c = r.scalar_one_or_none()
    if not c:
        raise HTTPException(404, "客户不存在")

    cnt_r = await db.execute(
        select(func.count(Order.id)).where(
            Order.customer_id == c.id,
            Order.tenant_id == current_user.tenant_id,
        )
    )
    orders_count = cnt_r.scalar() or 0

    spent_r = await db.execute(
        select(func.coalesce(func.sum(Order.grand_total), 0)).where(
            Order.customer_id == c.id,
            Order.tenant_id == current_user.tenant_id,
            Order.status.in_(["paid", "shipped", "completed"]),
        )
    )
    total_spent = spent_r.scalar() or Decimal("0")

    if total_spent >= Decimal("10000"):
        tier = "platinum"
    elif total_spent >= Decimal("5000"):
        tier = "gold"
    elif total_spent >= Decimal("1000"):
        tier = "silver"
    else:
        tier = "regular"

    return CustomerOut(
        id=c.id,
        name=c.name or "",
        email=c.email or "",
        phone=c.phone or "",
        orders_count=orders_count,
        total_spent=total_spent,
        membership_tier=tier,
        created_at=c.created_at,
    )