from typing import List, Literal, Optional, Union
from pydantic import BaseModel, Field
from langchain.schema import HumanMessage, AIMessage, SystemMessage

class ChatRequest(BaseModel):
    question: str = Field(description='User question')
    history: Optional[List[Union[HumanMessage, AIMessage, SystemMessage]]] = Field(description="Conversation History with User", default=None)
    roomList: Optional[List]

class ChatAdditonal(BaseModel):
    actions: Optional[List[Literal['change-url', 'scrollTo']]] = Field(description="Actions Enum that need to trigger on frontend")
    createDiv: Optional[str] = Field(description="Info to Create Additonal Div in chat window component", default=None)
    roomList: Optional[list] = Field(description="List of Rooms with Additonal Details", default=None)
    roomInfo: Optional[list] = Field(description="Rooms Info", default=None)
    roomIDs : Optional[List[int]] = Field(description="List of ids that are filtered")
    entities: Optional[dict] = Field(description="Fetched schema entities", default=None)
    url: Optional[str] = Field(description="Url which trigger with 'change-url' action", default=None)
    scrollToElement: Optional[str] = Field(description="Query Selector of Element upto which we scroll window automatically in frontend", default=None)
    showDiv : Optional[List[Literal['actionAdult', 'actionDate']]] = Field(description="List for showing div of taking input of dates and count of person")
    details: Optional[dict] = Field(description="Details about the adult and children count and checkin and checkout date")
class ChatResponse(BaseModel):
    answer: str = Field(description="Assistant Answer")
    followUpQuestions:Optional[List[str]] = Field(description="Generate 2-3 follow up questions which could be the next question of the user.",default=[])
    additional: Optional[ChatAdditonal] = Field(description="Addiitonal Information to pass down to Chat", default=None)
    

