# app/modules/cart/schemas/cart.py
"""
Pydantic schemas for shopping cart operations.
"""

from pydantic import BaseModel, ConfigDict, Field

# ============================================================================
# Request Schemas
# ============================================================================


class AddToCartRequest(BaseModel):
    """Request model for adding items to cart."""

    product_id: int = Field(..., description="Product ID to add", gt=0)
    quantity: int = Field(1, ge=1, description="Quantity to add")


class UpdateCartItemRequest(BaseModel):
    """Request model for updating cart item quantity."""

    quantity: int = Field(..., ge=1, description="New quantity (must be >= 1)")


# ============================================================================
# Response Schemas
# ============================================================================


class CartItemResponse(BaseModel):
    """Response model for a single cart item."""

    model_config = ConfigDict(from_attributes=True)

    product_id: int = Field(..., description="Product ID")
    product_name: str = Field(..., description="Product name")
    quantity: int = Field(..., description="Quantity in cart")
    price: float = Field(..., description="Price per unit when added to cart")
    line_total: float = Field(
        ..., description="Total price for this line (price * quantity)"
    )
    image_url: str | None = Field(None, description="Product image URL")


class CartResponse(BaseModel):
    """Response model for shopping cart."""

    store_id: int = Field(..., description="Store ID")
    session_id: str = Field(..., description="Shopping session ID")
    items: list[CartItemResponse] = Field(
        default_factory=list, description="Cart items"
    )
    subtotal: float = Field(..., description="Subtotal of all items")
    total: float = Field(..., description="Total amount (currently same as subtotal)")
    item_count: int = Field(..., description="Total number of items in cart")

    @classmethod
    def from_service_dict(cls, cart_dict: dict) -> "CartResponse":
        """
        Create CartResponse from service layer dictionary.

        This is a convenience method to convert the dictionary format
        returned by cart_service into a proper Pydantic model.
        """
        items = [CartItemResponse(**item) for item in cart_dict.get("items", [])]
        return cls(
            store_id=cart_dict["store_id"],
            session_id=cart_dict["session_id"],
            items=items,
            subtotal=cart_dict["subtotal"],
            total=cart_dict["total"],
            item_count=len(items),
        )


class CartOperationResponse(BaseModel):
    """Response model for cart operations (add, update, remove)."""

    message: str = Field(..., description="Operation result message")
    product_id: int = Field(..., description="Product ID affected")
    quantity: int | None = Field(
        None, description="New quantity (for add/update operations)"
    )


class ClearCartResponse(BaseModel):
    """Response model for clearing cart."""

    message: str = Field(..., description="Operation result message")
    items_removed: int = Field(..., description="Number of items removed from cart")
