from typing import Any, Literal

from pydantic import Field

from app.schemas.common import APIBaseModel, ErrorString, ResponseType


class ButtonOption(APIBaseModel):
    id: str
    title: str


class QuickReplyOption(APIBaseModel):
    id: str
    title: str


class ListRow(APIBaseModel):
    id: str
    title: str
    description: str | None = None


class ListSection(APIBaseModel):
    title: str
    rows: list[ListRow]


class TextMessage(APIBaseModel):
    type: Literal["text"] = "text"
    text: str


class ButtonsMessage(APIBaseModel):
    type: Literal["buttons"] = "buttons"
    text: str
    buttons: list[ButtonOption]
    fallback_text: str


class QuickRepliesMessage(APIBaseModel):
    type: Literal["quick_replies"] = "quick_replies"
    text: str
    quick_replies: list[QuickReplyOption]
    fallback_text: str


class ListMessage(APIBaseModel):
    type: Literal["list"] = "list"
    text: str
    button_text: str
    sections: list[ListSection]
    fallback_text: str


class RatingMessage(APIBaseModel):
    type: Literal["rating"] = "rating"
    text: str
    scale_min: int = 1
    scale_max: int = 5
    labels: dict[str, str] = Field(default_factory=dict)
    fallback_text: str


ConversationMessage = TextMessage | ButtonsMessage | QuickRepliesMessage | ListMessage | RatingMessage


class ConversationData(APIBaseModel):
    messages: list[ConversationMessage] = Field(default_factory=list)


class ConversationResponse(APIBaseModel):
    error: ErrorString = "false"
    mensaje: str
    response_type: ResponseType
    data: dict[str, Any] = Field(default_factory=dict)


class RenderRequest(APIBaseModel):
    mode: Literal["internal", "freshchat_simple", "fallback"]
    payload: dict[str, Any]

