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

class InvoiceItemCreate(BaseModel):
    product_id: UUID | None = None; variant_id: UUID | None = None
    description: str = Field(min_length=1, max_length=500); quantity: Decimal = Field(gt=0)
    unit_price: Decimal = Field(ge=0); discount: Decimal = Field(default=Decimal("0"), ge=0)
class InvoiceCreate(BaseModel):
    customer_id: UUID | None = None; branch_id: UUID | None = None; sale_id: UUID | None = None
    invoice_number: str = Field(min_length=1, max_length=100); issue_date: date = Field(default_factory=date.today); due_date: date | None = None
    discount: Decimal = Field(default=Decimal("0"), ge=0); tax: Decimal = Field(default=Decimal("0"), ge=0); notes: str | None = None
    items: list[InvoiceItemCreate] = Field(default_factory=list)
class InvoiceUpdate(BaseModel):
    customer_id: UUID | None = None; branch_id: UUID | None = None; invoice_number: str | None = Field(default=None, min_length=1, max_length=100)
    issue_date: date | None = None; due_date: date | None = None; discount: Decimal | None = Field(default=None, ge=0); tax: Decimal | None = Field(default=None, ge=0); notes: str | None = None
    items: list[InvoiceItemCreate] | None = None
class InvoicePaymentCreate(BaseModel):
    amount: Decimal = Field(gt=0); payment_method: str; reference: str | None = Field(default=None, max_length=150)
