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

class PurchaseItemCreate(BaseModel):
    product_id: UUID
    variant_id: UUID | None = None
    unit_id: UUID | None = None
    quantity: Decimal = Field(gt=0)
    unit_cost: Decimal = Field(ge=0)
    expiry_date: date | None = None

class PurchaseCreate(BaseModel):
    branch_id: UUID
    supplier_id: UUID
    reference_number: str = Field(min_length=1, max_length=100)
    purchase_date: date
    lifecycle_status: str = "DRAFT"
    discount: Decimal = Field(default=Decimal("0"), ge=0)
    tax: Decimal = Field(default=Decimal("0"), ge=0)
    notes: str | None = None
    items: list[PurchaseItemCreate] = Field(min_length=1)

class PurchaseUpdate(BaseModel):
    branch_id: UUID | None = None
    supplier_id: UUID | None = None
    reference_number: str | None = Field(default=None, min_length=1, max_length=100)
    purchase_date: date | None = None
    lifecycle_status: str | None = None
    discount: Decimal | None = Field(default=None, ge=0)
    tax: Decimal | None = Field(default=None, ge=0)
    notes: str | None = None
    items: list[PurchaseItemCreate] | None = Field(default=None, min_length=1)

class PurchasePaymentCreate(BaseModel):
    amount: Decimal = Field(gt=0)
    payment_method: str
    reference: str | None = Field(default=None, max_length=150)
