from pydantic import BaseModel, EmailStr, Field, ConfigDict from typing import Optional, List from datetime import datetime # Response models class MaterialBase(BaseModel): id: int name_en: Optional[str] = None name_ru: Optional[str] = None name_ua: Optional[str] = None name_me: Optional[str] = None desc_en: Optional[str] = None desc_ru: Optional[str] = None desc_ua: Optional[str] = None desc_me: Optional[str] = None price_per_cm3: float is_active: bool class ServiceBase(BaseModel): id: int name_en: Optional[str] = None name_ru: Optional[str] = None name_ua: Optional[str] = None name_me: Optional[str] = None desc_en: Optional[str] = None desc_ru: Optional[str] = None desc_ua: Optional[str] = None desc_me: Optional[str] = None tech_type: Optional[str] = None is_active: bool # Management models class MaterialCreate(BaseModel): name_en: str name_ru: str name_ua: str name_me: str desc_en: str desc_ru: str desc_ua: str desc_me: str price_per_cm3: float is_active: bool = True class MaterialUpdate(BaseModel): name_en: Optional[str] = None name_ru: Optional[str] = None name_ua: Optional[str] = None name_me: Optional[str] = None desc_en: Optional[str] = None desc_ru: Optional[str] = None desc_ua: Optional[str] = None desc_me: Optional[str] = None price_per_cm3: Optional[float] = None is_active: Optional[bool] = None class ServiceCreate(BaseModel): name_en: str name_ru: str name_ua: str name_me: str desc_en: str desc_ru: str desc_ua: str desc_me: str tech_type: Optional[str] = None is_active: bool = True class ServiceUpdate(BaseModel): name_en: Optional[str] = None name_ru: Optional[str] = None name_ua: Optional[str] = None name_me: Optional[str] = None desc_en: Optional[str] = None desc_ru: Optional[str] = None desc_ua: Optional[str] = None desc_me: Optional[str] = None tech_type: Optional[str] = None is_active: Optional[bool] = None # Order creation models class OrderFileBase(BaseModel): filename: str file_size: Optional[int] class OrderCreate(BaseModel): first_name: str = Field(..., min_length=1) last_name: str = Field(..., min_length=1) phone: str = Field(..., min_length=5) email: EmailStr shipping_address: str = Field(..., min_length=10) model_link: Optional[str] = None quantity: int = Field(1, ge=1) notes: Optional[str] = None # User models class UserCreate(BaseModel): email: EmailStr password: str = Field(..., min_length=6) first_name: Optional[str] = None last_name: Optional[str] = None phone: Optional[str] = None shipping_address: Optional[str] = None preferred_language: Optional[str] = "en" class UserUpdate(BaseModel): first_name: Optional[str] = None last_name: Optional[str] = None phone: Optional[str] = None shipping_address: Optional[str] = None preferred_language: Optional[str] = None class UserLogin(BaseModel): email: EmailStr password: str class UserResponse(BaseModel): id: int email: EmailStr first_name: Optional[str] = None last_name: Optional[str] = None phone: Optional[str] = None shipping_address: Optional[str] = None preferred_language: str = "en" role: str ip_address: Optional[str] = None created_at: datetime model_config = ConfigDict(from_attributes=True) class AdminOrderUpdate(BaseModel): status: Optional[str] = None total_price: Optional[float] = None send_notification: Optional[bool] = False class EstimateRequest(BaseModel): material_id: int file_sizes: List[int] # in bytes file_quantities: Optional[List[int]] = None # Possible to add density or other params later class Token(BaseModel): access_token: str token_type: str class SocialLogin(BaseModel): provider: str # 'google' or 'facebook' token: str email: EmailStr first_name: Optional[str] = None last_name: Optional[str] = None preferred_language: Optional[str] = "en" class ForgotPassword(BaseModel): email: EmailStr class ResetPassword(BaseModel): token: str new_password: str = Field(..., min_length=6) class PhotoUpdate(BaseModel): is_public: bool class OrderResponse(OrderCreate): id: int status: str total_price: Optional[float] = None estimated_price: Optional[float] = None material_name: Optional[str] = None material_price: Optional[float] = None created_at: datetime model_config = ConfigDict(from_attributes=True) class MessageCreate(BaseModel): message: str