from datetime import datetime from typing import Any from pydantic import BaseModel, EmailStr, Field from app.models.user import UserRole class UserCreate(BaseModel): email: EmailStr username: str = Field(min_length=3, max_length=100) password: str = Field(min_length=6) confirm_password: str = Field(min_length=6) class RegisterResponse(BaseModel): message: str email: str class ActivateAccountRequest(BaseModel): email: EmailStr code: str = Field(min_length=4, max_length=10) class ForgotPasswordRequest(BaseModel): email: EmailStr class ResetPasswordRequest(BaseModel): email: EmailStr code: str = Field(min_length=4, max_length=10) password: str = Field(min_length=6) confirm_password: str = Field(min_length=6) class MessageResponse(BaseModel): message: str class AdminUserCreate(BaseModel): email: EmailStr username: str = Field(min_length=3, max_length=100) password: str = Field(min_length=6) role: UserRole = UserRole.user class UserUpdate(BaseModel): email: EmailStr | None = None username: str | None = Field(default=None, min_length=3, max_length=100) role: UserRole | None = None is_active: bool | None = None password: str | None = Field(default=None, min_length=6) class UserLogin(BaseModel): username: str password: str class UserResponse(BaseModel): id: int email: str username: str role: UserRole is_active: bool created_at: datetime model_config = {"from_attributes": True} class Token(BaseModel): access_token: str token_type: str = "bearer" class TokenData(BaseModel): username: str | None = None class StyleParams(BaseModel): font_name: str | None = None font_size: float | None = None bold: bool = False italic: bool = False underline: bool = False color: str | None = None alignment: str | None = None background_color: str | None = None border_style: str | None = None width: float | None = None height: float | None = None table_style: dict[str, Any] | None = None class TemplateVariableResponse(BaseModel): id: int name: str label: str field_type: str default_value: str | None = None is_required: bool order: int parent_variable: str | None = None style_params: dict[str, Any] | None = None model_config = {"from_attributes": True} class TemplateVariableUpdate(BaseModel): label: str | None = None field_type: str | None = None default_value: str | None = None is_required: bool | None = None class TemplateUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=255) description: str | None = None is_public: bool | None = None class DocumentTemplateResponse(BaseModel): id: int name: str description: str | None original_filename: str owner_id: int owner_username: str | None = None is_public: bool is_owner: bool = False created_at: datetime updated_at: datetime variables: list[TemplateVariableResponse] = [] model_config = {"from_attributes": True} class DocumentTemplateListItem(BaseModel): id: int name: str description: str | None original_filename: str owner_id: int owner_username: str | None = None is_public: bool is_owner: bool = False created_at: datetime variable_count: int = 0 model_config = {"from_attributes": True} class FilledDocumentCreate(BaseModel): template_id: int name: str field_data: dict[str, Any] class FilledDocumentUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=255) field_data: dict[str, Any] | None = None class FilledDocumentResponse(BaseModel): id: int template_id: int owner_id: int owner_username: str | None = None name: str field_data: dict[str, Any] created_at: datetime model_config = {"from_attributes": True} class PreviewResponse(BaseModel): html: str field_data: dict[str, Any]