import uuid from datetime import datetime from typing import Literal, Optional from pydantic import BaseModel, ConfigDict class CategoryCreate(BaseModel): study_id: Optional[uuid.UUID] = None name: str description: Optional[str] = None sort_order: int = 0 is_active: bool = True class CategoryUpdate(BaseModel): study_id: Optional[uuid.UUID] = None name: Optional[str] = None description: Optional[str] = None sort_order: Optional[int] = None is_active: Optional[bool] = None class CategoryRead(BaseModel): id: uuid.UUID study_id: Optional[uuid.UUID] name: str description: Optional[str] sort_order: int is_active: bool created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class FaqCreate(BaseModel): study_id: Optional[uuid.UUID] = None category_id: uuid.UUID question: str answer: Optional[str] = None class FaqUpdate(BaseModel): question: Optional[str] = None answer: Optional[str] = None is_active: Optional[bool] = None class FaqStatusUpdate(BaseModel): status: Literal["PENDING", "PROCESSING", "RESOLVED"] class FaqBestReplyUpdate(BaseModel): best_reply_id: Optional[uuid.UUID] = None class FaqReplyCreate(BaseModel): content: str quote_reply_id: Optional[uuid.UUID] = None class FaqReplyQuote(BaseModel): id: uuid.UUID content: str created_by: uuid.UUID created_at: datetime model_config = ConfigDict(from_attributes=True) class FaqReplyRead(BaseModel): id: uuid.UUID faq_id: uuid.UUID study_id: Optional[uuid.UUID] content: str created_by: uuid.UUID created_at: datetime quote_reply_id: Optional[uuid.UUID] = None quote: Optional[FaqReplyQuote] = None is_deleted: bool = False model_config = ConfigDict(from_attributes=True) class FaqRead(BaseModel): id: uuid.UUID study_id: Optional[uuid.UUID] category_id: uuid.UUID best_reply_id: Optional[uuid.UUID] = None status: Literal["PENDING", "PROCESSING", "RESOLVED"] = "PENDING" resolved_by_confirm: bool = False question: str answer: str keywords: Optional[str] version: int is_active: bool created_by: uuid.UUID created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True)