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

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

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).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)).scalars().all()
    return rows


@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.reply = body.reply
    row.reply_at = datetime.utcnow()
    await db.commit()
    return {"ok": True}