from fastapi import APIRouter, HTTPException, Request, Depends
from fastapi.responses import JSONResponse
from typing import Optional
from model.ticket_model import TicketCreatePayload, TicketUpdateRequest, TicketModel
from utils.auth_helper import requires_permission, assert_actor_match
from utils.turnstile_helper import verify_turnstile
import traceback

router = APIRouter()

class TicketAdminUpdateRequest(TicketUpdateRequest):
    actorId: str

@router.post("", dependencies=[Depends(verify_turnstile)])
def create_ticket(payload: TicketCreatePayload):
    try:
        success, message = TicketModel.create_ticket(payload)
        return JSONResponse(status_code=201, content={"success": success, "message": message})
    except Exception as e:
        print(" [CREATE TICKET] LỖI CRASH HỆ THỐNG:")
        traceback.print_exc()
        raise HTTPException(status_code=500, detail=f"Lỗi Server: {str(e)}")

@router.get("")
def get_tickets(
    request: Request,
    status: Optional[str] = None,
    dateFrom: Optional[str] = None,
    dateTo: Optional[str] = None,
    id_khach_hang: Optional[str] = None
):
    try:
        base_url = str(request.base_url).rstrip("/")
        # Chuyển việc query và filter cho Model lo
        data = TicketModel.get_tickets(base_url, status, dateFrom, dateTo, id_khach_hang)
        
        return JSONResponse(status_code=200, content={
            "success": True,
            "data": data,
            "total": len(data)
        })
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Lỗi Server: {str(e)}")
    
@router.put("/update-ticket", dependencies=[Depends(verify_turnstile)])
def update_ticket_status(
    req: TicketAdminUpdateRequest,
    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)

        # Tạm thời nếu model chưa nhận actor_id thì vẫn để đây để dùng log/debug
        # Sau này có thể truyền xuống model:
        # success, msg, code = TicketModel.update_ticket_status(req, actor_id=actor_id, actor_name=actor_name)

        success, msg, code = TicketModel.update_ticket_status(req)

        return JSONResponse(
            status_code=code,
            content={
                "success": success,
                "message": msg,
                "actedBy": {
                    "id": actor_id,
                    "name": actor_name
                }
            }
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Lỗi Server: {str(e)}")