from datetime import date, datetime
from decimal import Decimal
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field

class CategoryCreate(BaseModel): name: str = Field(min_length=1, max_length=150); description: str | None = None
class UnitCreate(BaseModel): name: str = Field(min_length=1, max_length=100); symbol: str = Field(min_length=1, max_length=30)
class ConversionInput(BaseModel): unit_id: UUID; quantity_in_base: Decimal = Field(gt=0); selling_price: Decimal | None = Field(default=None, ge=0); is_purchase_unit: bool = False; is_selling_unit: bool = False
class VariantInput(BaseModel): name: str; attributes: dict[str, str]; sku: str | None = None; barcode: str | None = None; selling_price: Decimal | None = Field(default=None, ge=0)
class ProductCreate(BaseModel):
    name: str = Field(min_length=1, max_length=200); product_type: str
    category_id: UUID | None = None; base_unit_id: UUID | None = None; description: str | None = None
    sku: str | None = None; barcode: str | None = None; purchase_price: Decimal | None = Field(default=None, ge=0); selling_price: Decimal = Field(default=Decimal("0"), ge=0)
    low_stock_alert: Decimal | None = Field(default=None, ge=0); track_stock: bool = True; expiry_date: date | None = None; image_url: str | None = None
    conversions: list[ConversionInput] = []; variants: list[VariantInput] = []
class ProductUpdate(BaseModel):
    model_config = ConfigDict(extra='forbid')
    name: str | None = Field(default=None, min_length=1, max_length=200)
    category_id: UUID | None = None
    description: str | None = None
    sku: str | None = Field(default=None, max_length=100)
    barcode: str | None = Field(default=None, max_length=100)
    purchase_price: Decimal | None = Field(default=None, ge=0)
    selling_price: Decimal | None = Field(default=None, ge=0)
    low_stock_alert: Decimal | None = Field(default=None, ge=0)
    expiry_date: date | None = None
    image_url: str | None = Field(default=None, max_length=500)
    product_type: str | None = None
    base_unit_id: UUID | None = None
    track_stock: bool | None = None

class ConversionUpdate(BaseModel):
    model_config = ConfigDict(extra='forbid')
    quantity_in_base: Decimal | None = Field(default=None, gt=0)
    selling_price: Decimal | None = Field(default=None, ge=0)
    is_purchase_unit: bool | None = None
    is_selling_unit: bool | None = None

class VariantUpdate(BaseModel):
    model_config = ConfigDict(extra='forbid')
    name: str | None = Field(default=None, min_length=1, max_length=200)
    attributes: dict[str, str] | None = None
    sku: str | None = Field(default=None, max_length=100)
    barcode: str | None = Field(default=None, max_length=100)
    selling_price: Decimal | None = Field(default=None, ge=0)
    is_active: bool | None = None

class ProductStatusUpdate(BaseModel): is_active: bool
class OpeningStockCreate(BaseModel):
    branch_id: UUID
    quantity: Decimal = Field(gt=0)
    variant_id: UUID | None = None
    comment: str | None = None
class AdjustmentCreate(BaseModel): product_id: UUID; variant_id: UUID | None = None; quantity_changed: Decimal; reason: str; comment: str | None = None
class TransferCreate(BaseModel): source_branch_id: UUID; destination_branch_id: UUID; product_id: UUID; variant_id: UUID | None = None; quantity: Decimal = Field(gt=0); comment: str | None = None
class InventoryOut(BaseModel): product_id: UUID; variant_id: UUID | None; quantity: Decimal; low_stock_threshold: Decimal | None; expiry_date: date | None; updated_at: datetime
    
