"""Widget + session + message request/response şemaları."""
from datetime import datetime

from pydantic import BaseModel, ConfigDict, EmailStr, Field

# ============================================================
# WIDGET (panel)
# ============================================================


class CreateWidgetRequest(BaseModel):
    name: str = Field(min_length=1, max_length=200)
    allowed_domains: list[str] | None = None
    ai_enabled: bool = True
    persona: dict | None = None
    settings: dict | None = None


class UpdateWidgetRequest(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=200)
    allowed_domains: list[str] | None = None
    ai_enabled: bool | None = None
    is_online: bool | None = None
    persona: dict | None = None
    settings: dict | None = None


class WidgetResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    tenant_id: str
    name: str
    api_key: str
    allowed_domains: list | None
    ai_enabled: bool
    is_online: bool
    persona: dict | None
    settings: dict | None
    created_at: datetime


class WidgetSettingsResponse(BaseModel):
    """Public — embed snippet'in çektiği config."""

    widget_id: str
    name: str
    is_online: bool
    ai_enabled: bool
    streaming_enabled: bool
    product_count: int
    settings: dict


# ============================================================
# SESSION (widget)
# ============================================================


class CreateSessionRequest(BaseModel):
    visitor_name: str | None = Field(default=None, max_length=200)
    visitor_email: EmailStr | None = None
    visitor_phone: str | None = Field(default=None, max_length=30)
    page_url: str | None = Field(default=None, max_length=1000)
    referrer: str | None = Field(default=None, max_length=500)
    kvkk_consent: bool = False
    visitor_uuid: str | None = Field(default=None, max_length=64)


class SessionResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    session_token: str
    status: str
    visitor_name: str | None
    visitor_email: str | None
    intent: str | None
    started_at: datetime
    ended_at: datetime | None


# ============================================================
# MESSAGE
# ============================================================


class SendMessageRequest(BaseModel):
    session_token: str = Field(min_length=1, max_length=64)
    message: str = Field(min_length=1, max_length=4000)


class OperatorMessageRequest(BaseModel):
    message: str = Field(min_length=1, max_length=4000)


class MessageResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    session_id: str
    sender_type: str
    message: str
    message_type: str
    meta: dict | None
    created_at: datetime


class ChatTurnResponse(BaseModel):
    """message/send sonucu — ziyaretçi mesajı + AI cevabı + ui blokları."""

    message: MessageResponse
    reply: MessageResponse | None = None
    ui_blocks: list[dict] = []
    intent: str | None = None
    layer: str | None = None
    escalated: bool = False


# ============================================================
# NPS / IDLE
# ============================================================


class NpsRequest(BaseModel):
    session_token: str = Field(min_length=1, max_length=64)
    score: int = Field(ge=0, le=10)
    comment: str | None = Field(default=None, max_length=2000)
