import uuid
from datetime import datetime
from typing import Any

from sqlalchemy import Column, Text
from sqlalchemy.dialects.postgresql import JSONB
from sqlmodel import Field, SQLModel

from app.db.base import TenantModel, utcnow


class Conversation(TenantModel, table=True):
    __tablename__ = "conversation"

    id: str = Field(default_factory=lambda: str(uuid.uuid4()), primary_key=True)
    channel: str = Field(nullable=False)
    agent_type: str | None = Field(default=None, nullable=True)
    status: str = Field(default="active", nullable=False)
    summary: str | None = Field(default=None, nullable=True)
    customer_id: str | None = Field(
        default=None, foreign_key="customer.id", index=True, nullable=True
    )
    identity_key: str = Field(nullable=False)
    ended_at: datetime | None = Field(default=None, nullable=True)
    message_count: int = Field(default=0, nullable=False)
    last_message_preview: str | None = Field(default=None, sa_column=Column(Text, nullable=True))
    last_message_at: datetime | None = Field(default=None, nullable=True)
    last_customer_message_at: datetime | None = Field(default=None, nullable=True)
    last_agent_type: str | None = Field(default=None, nullable=True)
    language: str | None = Field(default=None, nullable=True, max_length=5)
    message_history_json: str | None = Field(default=None, sa_column=Column(Text, nullable=True))
    context_enabled: bool = Field(default=True, nullable=False)


class ConversationCreate(SQLModel):
    channel: str
    agent_type: str | None = None
    identity_key: str
    customer_id: str | None = None
    language: str | None = None


class ConversationRead(SQLModel):
    id: str
    restaurant_id: str
    channel: str
    status: str
    created_at: datetime

    language: str | None = None


class ConversationSessionRead(SQLModel):
    """Schema for session listing API response."""

    id: str
    channel: str
    status: str

    language: str | None = None


class MessageRead(SQLModel):
    """Schema for message transcript API response."""

    id: str
    role: str
    content: str
    created_at: str


class Message(SQLModel, table=True):
    __tablename__ = "message"

    id: str = Field(default_factory=lambda: str(uuid.uuid4()), primary_key=True)
    conversation_id: str = Field(foreign_key="conversation.id", index=True, nullable=False)
    restaurant_id: str = Field(foreign_key="restaurant.id", index=True, nullable=False)
    role: str = Field(nullable=False)
    content: str = Field(nullable=False)
    tool_calls: Any | None = Field(default=None, sa_column=Column(JSONB))
    token_count: int | None = Field(default=None, nullable=True)
    created_at: datetime = Field(default_factory=utcnow, nullable=False)
