from datetime import datetime, timezone

from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, get_superadmin_user
from app.core.models.user import User

router = APIRouter(prefix="/superadmin/plugin-approvals", tags=["SuperAdmin plugin approvals"])


class ReviewBody(BaseModel):
    review_note: str | None = None


@router.get("")
async def list_requests(
    status: str | None = Query(default="pending"),
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    where = "WHERE r.status=:status" if status else ""
    rows = (await db.execute(text(
        "SELECT r.id, r.tenant_id, t.name AS tenant_name, r.plugin_name, r.status, r.created_at, r.review_note "
        "FROM plugin_activation_requests r JOIN tenants t ON t.id=r.tenant_id " + where + " ORDER BY r.created_at DESC"
    ), {"status": status} if status else {})).mappings().all()
    return [dict(row) for row in rows]


async def _review(request_id: int, approved: bool, note: str | None, db: AsyncSession, user: User):
    request = (await db.execute(text(
        "SELECT id, tenant_id, plugin_name, status FROM plugin_activation_requests WHERE id=:id FOR UPDATE"
    ), {"id": request_id})).mappings().first()
    if not request:
        raise HTTPException(status_code=404, detail="审批申请不存在")
    if request["status"] != "pending":
        raise HTTPException(status_code=409, detail="该申请已处理")
    state = "approved" if approved else "rejected"
    await db.execute(text(
        "UPDATE plugin_activation_requests SET status=:state, reviewed_by=:uid, reviewed_at=:at, review_note=:note WHERE id=:id"
    ), {"state": state, "uid": user.id, "at": datetime.now(timezone.utc), "note": note, "id": request_id})
    if approved:
        await db.execute(text(
            "INSERT INTO plugin_configs (tenant_id, plugin_name, is_active) VALUES (:tid, :name, 1) "
            "ON DUPLICATE KEY UPDATE is_active=1"
        ), {"tid": request["tenant_id"], "name": request["plugin_name"]})
    await db.commit()
    return {"id": request_id, "status": state, "is_active": approved}


@router.post("/{request_id}/approve")
async def approve_request(request_id: int, body: ReviewBody, db: AsyncSession = Depends(get_db), _sa: User = Depends(get_superadmin_user)):
    return await _review(request_id, True, body.review_note, db, _sa)


@router.post("/{request_id}/reject")
async def reject_request(request_id: int, body: ReviewBody, db: AsyncSession = Depends(get_db), _sa: User = Depends(get_superadmin_user)):
    return await _review(request_id, False, body.review_note, db, _sa)
