# app/modules/catalog/schemas/product.py
"""
Pydantic schemas for Product CRUD operations.

These schemas are used for store product catalog management,
linking store products to marketplace products.
"""

from datetime import datetime

from pydantic import BaseModel, ConfigDict, Field

from app.modules.inventory.schemas import InventoryLocationResponse  # IMPORT-002
from app.modules.marketplace.schemas import MarketplaceProductResponse  # IMPORT-002


class ProductCreate(BaseModel):
    marketplace_product_id: int = Field(
        ..., description="MarketplaceProduct ID to add to store catalog"
    )
    store_sku: str | None = Field(None, description="Store's internal SKU")
    price: float | None = Field(None, ge=0)
    sale_price: float | None = Field(None, ge=0)
    currency: str | None = None
    availability: str | None = None
    condition: str | None = None
    is_featured: bool = False
    min_quantity: int = Field(1, ge=1)
    max_quantity: int | None = Field(None, ge=1)


class ProductUpdate(BaseModel):
    store_sku: str | None = None
    price: float | None = Field(None, ge=0)
    sale_price: float | None = Field(None, ge=0)
    currency: str | None = None
    availability: str | None = None
    condition: str | None = None
    is_featured: bool | None = None
    is_active: bool | None = None
    min_quantity: int | None = Field(None, ge=1)
    max_quantity: int | None = Field(None, ge=1)


class ProductResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    store_id: int
    marketplace_product: MarketplaceProductResponse
    store_sku: str | None
    price: float | None
    sale_price: float | None
    currency: str | None
    availability: str | None
    condition: str | None
    is_featured: bool
    is_active: bool
    display_order: int
    min_quantity: int
    max_quantity: int | None
    created_at: datetime
    updated_at: datetime

    # Include inventory summary
    total_inventory: int | None = None
    available_inventory: int | None = None


class ProductDetailResponse(ProductResponse):
    """Product with full inventory details."""

    inventory_locations: list[InventoryLocationResponse] = []


class ProductListResponse(BaseModel):
    products: list[ProductResponse]
    total: int
    skip: int
    limit: int


class ProductDeleteResponse(BaseModel):
    """Response for product deletion."""

    message: str


class ProductToggleResponse(BaseModel):
    """Response for product toggle operations (active/featured)."""

    message: str
    is_active: bool | None = None
    is_featured: bool | None = None
