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

class QuoteItemCreate(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 QuoteCreate(BaseModel):
    customer_id: UUID
    branch_id: UUID | None = None
    quote_number: str | None = Field(default=None, min_length=1, max_length=100)
    issue_date: date = Field(default_factory=date.today)
    expiry_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[QuoteItemCreate] = Field(min_length=1)

class QuoteUpdate(BaseModel):
    customer_id: UUID | None = None
    branch_id: UUID | None = None
    quote_number: str | None = Field(default=None, min_length=1, max_length=100)
    issue_date: date | None = None
    expiry_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[QuoteItemCreate] | None = Field(default=None, min_length=1)

class QuoteItemRead(QuoteItemCreate):
    id: UUID
    quote_id: UUID
    line_total: Decimal
    model_config = ConfigDict(from_attributes=True)

class QuoteRead(BaseModel):
    id: UUID; business_id: UUID; branch_id: UUID | None; customer_id: UUID; quote_number: str; status: str
    issue_date: date; expiry_date: date | None; subtotal: Decimal; discount: Decimal; tax: Decimal; total: Decimal
    notes: str | None; created_by: UUID; converted_invoice_id: UUID | None; created_at: datetime; updated_at: datetime
    items: list[QuoteItemRead]

class QuoteConversionRead(BaseModel):
    quote: QuoteRead
    invoice_id: UUID
