from typing import Optional
from pydantic import Field, ConfigDict
from src.apps.base.schemas.common import BaseSchema
from src.apps.payment_requests.enums import DiscountTypes
from src.apps.products.schemas.common import ProductSchema


class InvoiceLineItemBase(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    title: Optional[str] = Field(default=None, description="Name or title of line item")
    description: Optional[str] = Field(default=None, description="Description of line item")
    unit_price: float = Field(description="Price of line item")
    quantity: int = Field(description="Quantity of line item")
    tax: Optional[float] = Field(default=None, description="Tax amount of the line item")
    display_order: Optional[int] = Field(default=None, description="Display order of this line item")
    product_id: Optional[int] = Field(default=None, description="Product id of the line items")
    discount: Optional[float] = Field(default=None, description="Discount value")
    discount_type: Optional[DiscountTypes] = Field(default=None, description="Discount Type")
    cost: Optional[float] = Field(default=None, description="Cost value")
    upcharge: Optional[float] = Field(default=None, description="Upcharge value")


class InvoiceLineItemSchema(InvoiceLineItemBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of Line Item resource")
    product: Optional[ProductSchema] = Field(default=None, description="Product of the line item")


class InvoiceLineItemCreate(InvoiceLineItemBase):
    model_config = ConfigDict(from_attributes=True)


class InvoiceLineItemUpdate(InvoiceLineItemBase):
    model_config = ConfigDict(from_attributes=True)
