from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import StreamingResponse
from app.models.chat import ChatRequest, HotelChatRequest, HotelChatResponse

from app.services.langgraph_agent_service import LangGraphAgentService, get_langgraph_service
from app.services.hotel_langgraph_agent_service import (
    HotelLangGraphAgentService,
    get_hotel_langgraph_service,
)

router = APIRouter()


@router.post("/chat/stream", summary="Stream chat response using SSE with structured output")
async def chat_stream_endpoint(
    request: ChatRequest,
    langgraph_agent_service: LangGraphAgentService = Depends(get_langgraph_service),
):
    """
    Stream the query response using Server-Sent Events (SSE) while
    maintaining a structured output. Yields partial JSON chunks.
    """
    try:
        return StreamingResponse(
            langgraph_agent_service.stream_answer(request.query, request.history),
            media_type="text/event-stream",
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.post(
    "/hotel/chat",
    summary="Hotel guest chat with retrieval and human escalation",
    response_model=HotelChatResponse,
)
async def hotel_chat_endpoint(
    request: HotelChatRequest,
    hotel_agent_service: HotelLangGraphAgentService = Depends(get_hotel_langgraph_service),
):
    """
    Hotel guest assistant JSON endpoint.
    Tools: vector retrieval (hotel Pinecone) + human_escalation when unresolved.
    """
    try:
        result = await hotel_agent_service.answer(
            request.query,
            request.history,
            reservation_details=request.reservation_details,
        )
        return HotelChatResponse(**result)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
