from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, outerjoin

from app.api.deps import get_db, get_admin_user
from app.core.models.review import ProductReview
from app.core.models.product import Product
from app.core.models.user import User
from pydantic import BaseModel
from typing import Optional

router = APIRouter(prefix="/reviews", tags=["评价管理"])


class ReviewReply(BaseModel):
    reply: str


@router.get("")
async def list_reviews(
    status: Optional[str] = Query(None, description="过滤状态: pending/approved/hidden"),
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    q = (
        select(ProductReview, Product.name.label("product_name"))
        .outerjoin(Product, Product.id == ProductReview.product_id)
        .where(ProductReview.tenant_id == admin.tenant_id)
    )
    if status:
        q = q.where(ProductReview.status == status)
    q = q.order_by(ProductReview.created_at.desc())
    rows = (await db.execute(q)).all()
    result = []
    for review, product_name in rows:
        d = {c.name: getattr(review, c.name) for c in review.__table__.columns}
        d["product_name"] = product_name
        result.append(d)
    return result


@router.put("/{review_id}/status")
async def update_review_status(
    review_id: int,
    status: str = Query(..., description="approved/hidden"),
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    result = await db.execute(
        select(ProductReview).where(
            ProductReview.id == review_id,
            ProductReview.tenant_id == admin.tenant_id,
        )
    )
    row = result.scalar_one_or_none()
    if not row:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="评价不存在")
    row.status = status
    await db.commit()
    return {"ok": True}


@router.put("/{review_id}/reply")
async def reply_review(
    review_id: int,
    body: ReviewReply,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    result = await db.execute(
        select(ProductReview).where(
            ProductReview.id == review_id,
            ProductReview.tenant_id == admin.tenant_id,
        )
    )
    row = result.scalar_one_or_none()
    if not row:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="评价不存在")
    row.merchant_reply = body.reply
    await db.commit()
    return {"ok": True}