from pydantic import BaseModel, Field, ConfigDict
from typing import Literal

Role = Literal["OWNER", "SUPERVISOR", "MANAGER", "AUDITOR", "AI_AGENT", "PARTNER", "USER"]
class BootstrapOwner(BaseModel):
    username: str = Field(min_length=3, max_length=80, pattern=r"^[a-zA-Z0-9_.-]+$")
    password: str = Field(min_length=12, max_length=128)
    email: str | None = None
class LoginRequest(BaseModel):
    username: str
    password: str
class TokenResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    expires_in: int
class TicketCreate(BaseModel):
    subject: str = Field(min_length=3, max_length=200)
    category: str = "GENERAL"
    priority: Literal["P0", "P1", "P2", "P3", "P4"] = "P3"
    first_message: str = Field(min_length=1, max_length=10000)
class TicketMessageCreate(BaseModel):
    body: str = Field(min_length=1, max_length=10000)
    is_internal: bool = False
class TicketUpdate(BaseModel):
    status: Literal["OPEN", "IN_PROGRESS", "WAITING_USER", "ESCALATED", "RESOLVED", "CLOSED"] | None = None
    assignee_id: str | None = None
    priority: Literal["P0", "P1", "P2", "P3", "P4"] | None = None
class TicketOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: str
    public_id: str
    user_id: str
    assignee_id: str | None
    category: str
    priority: str
    status: str
    subject: str
    created_at: str | None = None
