import re from datetime import datetime from typing import List, Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator from models.api.stock import StockSummaryResponse class ProductBase(BaseModel): product_id: Optional[str] = None title: Optional[str] = None description: Optional[str] = None link: Optional[str] = None image_link: Optional[str] = None availability: Optional[str] = None price: Optional[str] = None brand: Optional[str] = None gtin: Optional[str] = None mpn: Optional[str] = None condition: Optional[str] = None adult: Optional[str] = None multipack: Optional[int] = None is_bundle: Optional[str] = None age_group: Optional[str] = None color: Optional[str] = None gender: Optional[str] = None material: Optional[str] = None pattern: Optional[str] = None size: Optional[str] = None size_type: Optional[str] = None size_system: Optional[str] = None item_group_id: Optional[str] = None google_product_category: Optional[str] = None product_type: Optional[str] = None custom_label_0: Optional[str] = None custom_label_1: Optional[str] = None custom_label_2: Optional[str] = None custom_label_3: Optional[str] = None custom_label_4: Optional[str] = None additional_image_link: Optional[str] = None sale_price: Optional[str] = None unit_pricing_measure: Optional[str] = None unit_pricing_base_measure: Optional[str] = None identifier_exists: Optional[str] = None shipping: Optional[str] = None currency: Optional[str] = None # New marketplace fields marketplace: Optional[str] = None shop_name: Optional[str] = None class ProductCreate(ProductBase): product_id: str = Field(..., min_length=1, description="Product ID is required") title: str = Field(..., min_length=1, description="Title is required") @field_validator("product_id", "title") @classmethod def validate_required_fields(cls, v): if not v or not v.strip(): raise ValueError("Field cannot be empty") return v.strip() class ProductUpdate(ProductBase): pass class ProductResponse(ProductBase): model_config = ConfigDict(from_attributes=True) id: int created_at: datetime updated_at: datetime class ProductListResponse(BaseModel): products: List[ProductResponse] total: int skip: int limit: int class ProductDetailResponse(BaseModel): product: ProductResponse stock_info: Optional[StockSummaryResponse] = None