from fastapi import APIRouter, Query, Depends
from fastapi.responses import JSONResponse
from typing import Optional
from model.topup_model import TopUpRequest, TopUpUpdateRequest, TopupModel
from utils.auth_helper import requires_permission, assert_actor_match
from utils.turnstile_helper import verify_turnstile

router = APIRouter()

class TopupAdminUpdateRequest(TopUpUpdateRequest):
    actorId: str

@router.post("", dependencies=[Depends(verify_turnstile)])
def create_topup(request: TopUpRequest):
    try:
        data = TopupModel.create_topup(request)
        return JSONResponse(status_code=201, content={"success": True, "data": data})
    except Exception as e:
        return JSONResponse(status_code=500, content={"success": False, "message": str(e)})

@router.get("")
def get_topups(
    type: str = "all", 
    page: int = 1, 
    pageSize: int = 10,
    status: Optional[str] = None,
    dateFrom: Optional[str] = None,
    dateTo: Optional[str] = None,
    id_khach_hang: Optional[str] = None
):
    try:
        data, total = TopupModel.get_topups(type, page, pageSize, id_khach_hang, status, dateFrom, dateTo)
        return {
            "success": True,
            "data": data,
            "total": total,
            "page": page,
            "pageSize": pageSize
        }
    except Exception as e:
        return JSONResponse(status_code=500, content={"success": False, "message": str(e)})

@router.put("/update-ticket", dependencies=[Depends(verify_turnstile)])
def update_ticket(
    req: TopupAdminUpdateRequest,
    current_user = Depends(requires_permission("ticket_finance"))
):
    try:
        actor_id = current_user["id"]
        actor_name = current_user.get("name", "")
        assert_actor_match(current_user, req.actorId)

        # Sau này nếu model hỗ trợ thì truyền xuống:
        # success, msg, code = TopupModel.update_ticket(req, actor_id=actor_id, actor_name=actor_name)

        success, msg, code = TopupModel.update_ticket(req)

        return JSONResponse(
            status_code=code,
            content={
                "success": success,
                "message": msg,
                "actedBy": {
                    "id": actor_id,
                    "name": actor_name
                }
            }
        )
    except Exception as e:
        return JSONResponse(status_code=500, content={"success": False, "message": str(e)})