from pydantic import BaseModel, ConfigDict
from typing import Optional, List
from datetime import datetime


class OrderItemBase(BaseModel):
    product_variant_id: int
    design_id: Optional[int] = None
    quantity: int = 1
    unit_price: Optional[float] = None
    subtotal: Optional[float] = None
    status: Optional[str] = None
    canvas_custom_width_mm: Optional[float] = None
    canvas_custom_height_mm: Optional[float] = None


class OrderItemCreate(OrderItemBase):
    pass


class OrderItemOut(OrderItemBase):
    id: int
    order_id: int
    model_config = ConfigDict(from_attributes=True)


class OrderBase(BaseModel):
    order_number: Optional[str] = None
    client_id: int
    delivery_address_id: Optional[int] = None
    status: Optional[str] = None
    total_amount: Optional[float] = None
    deposit_paid: Optional[float] = None
    due_date: Optional[datetime] = None
    notes: Optional[str] = None


class OrderCreate(OrderBase):
    items: Optional[List[OrderItemCreate]] = None


class OrderUpdate(BaseModel):
    status: Optional[str] = None
    total_amount: Optional[float] = None
    deposit_paid: Optional[float] = None
    due_date: Optional[datetime] = None
    notes: Optional[str] = None


class OrderOut(OrderBase):
    id: int
    items: List[OrderItemOut] = []
    model_config = ConfigDict(from_attributes=True)
