# models/schema/product.py from datetime import datetime from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field from models.schema.marketplace_product import MarketplaceProductResponse from models.schema.inventory import InventoryLocationResponse class ProductCreate(BaseModel): marketplace_product_id: int = Field(..., description="MarketplaceProduct ID to add to vendor catalog") product_id: Optional[str] = Field(None, description="Vendor's internal SKU/product ID") price: Optional[float] = Field(None, ge=0) sale_price: Optional[float] = Field(None, ge=0) currency: Optional[str] = None availability: Optional[str] = None condition: Optional[str] = None is_featured: bool = False min_quantity: int = Field(1, ge=1) max_quantity: Optional[int] = Field(None, ge=1) class ProductUpdate(BaseModel): product_id: Optional[str] = None price: Optional[float] = Field(None, ge=0) sale_price: Optional[float] = Field(None, ge=0) currency: Optional[str] = None availability: Optional[str] = None condition: Optional[str] = None is_featured: Optional[bool] = None is_active: Optional[bool] = None min_quantity: Optional[int] = Field(None, ge=1) max_quantity: Optional[int] = Field(None, ge=1) class ProductResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: int vendor_id: int marketplace_product: MarketplaceProductResponse product_id: Optional[str] price: Optional[float] sale_price: Optional[float] currency: Optional[str] availability: Optional[str] condition: Optional[str] is_featured: bool is_active: bool display_order: int min_quantity: int max_quantity: Optional[int] created_at: datetime updated_at: datetime # Include inventory summary total_inventory: Optional[int] = None available_inventory: Optional[int] = None class ProductDetailResponse(ProductResponse): """Product with full inventory details.""" inventory_locations: List[InventoryLocationResponse] = [] class ProductListResponse(BaseModel): products: List[ProductResponse] total: int skip: int limit: int