from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime


# Thread Schemas
class ThreadCreateRequest(BaseModel):
    store_id: int
    branch_id: Optional[int] = None
    user_id: int
    title: Optional[str] = Field(None, max_length=255)
    description: Optional[str] = None
    thread_type: str = Field(default="general", max_length=50)


class ThreadUpdateRequest(BaseModel):
    title: Optional[str] = Field(None, max_length=255)
    description: Optional[str] = None
    thread_type: Optional[str] = Field(None, max_length=50)
    is_archived: Optional[bool] = None


class ThreadResponse(BaseModel):
    id: int
    store_id: int
    branch_id: Optional[int] = None
    user_id: int
    title: Optional[str] = None
    description: Optional[str] = None
    thread_type: str
    is_active: bool
    is_archived: bool
    created_at: datetime
    updated_at: datetime
    message_count: Optional[int] = None


# Message Schemas
class MessageCreateRequest(BaseModel):
    thread_id: int
    user_id: int
    role: str = Field(..., max_length=20)  # user, assistant, system
    content: str
    message_type: str = Field(default="text", max_length=50)
    image_url: Optional[str] = Field(None, max_length=500)
    model_used: Optional[str] = Field(None, max_length=100)


class MessageUpdateRequest(BaseModel):
    content: Optional[str] = None
    message_type: Optional[str] = Field(None, max_length=50)
    image_url: Optional[str] = Field(None, max_length=500)
    is_deleted: Optional[bool] = None


class MessageResponse(BaseModel):
    id: int
    thread_id: int
    user_id: int
    role: str
    content: str
    message_type: str
    image_url: Optional[str] = None
    tokens_used: Optional[int] = None
    model_used: Optional[str] = None
    created_at: datetime
    updated_at: datetime
    is_deleted: bool


# Thread with Messages
class ThreadWithMessagesResponse(BaseModel):
    thread: ThreadResponse
    messages: List[MessageResponse]
    total_messages: int


# Thread List Response
class ThreadListResponse(BaseModel):
    threads: List[ThreadResponse]
    total_threads: int
    page: int
    page_size: int


# Chat Completion Request
class ChatCompletionRequest(BaseModel):
    thread_id: int
    user_id: int
    message: str
    system_prompt: Optional[str] = None
    model: Optional[str] = Field(None, description="Azure OpenAI model to use")


# Chat Completion Response
class ChatCompletionResponse(BaseModel):
    success: bool
    message: str
    thread_id: int
    user_message: MessageResponse
    assistant_message: MessageResponse
    tokens_used: Optional[int] = None
    model_used: Optional[str] = None
