from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime


# Base schemas
class ProductBase(BaseModel):
    product_id: int
    product_name: str
    short_name: Optional[str] = None
    description: Optional[str] = None
    brand_name: Optional[str] = None
    fk_product_category_id: Optional[int] = None
    image_path: Optional[str] = None
    eligible_for_return: Optional[bool] = False
    display_on_pos: Optional[bool] = False
    display_on_online_store: Optional[bool] = False


class LocationBase(BaseModel):
    location_id: int
    location_name: str


class VendorBase(BaseModel):
    vendor_id: int
    vendor_name: str
    vendor_code: Optional[str] = None


class CategoryBase(BaseModel):
    category_id: int
    category_name: str


class ProductPriceBase(BaseModel):
    product_price_id: int
    product_id: int
    location_id: int
    cost_price_per_unit: Optional[float] = None
    markup_value: Optional[float] = None
    margin_value: Optional[float] = None
    retail_price_excl_tax: Optional[float] = None
    compare_at_price: Optional[float] = 0
    markup_type_name: Optional[str] = None
    margin_type_name: Optional[str] = None


class ProductVendorBase(BaseModel):
    product_id: int
    vendor_id: int


class ProductLocationBase(BaseModel):
    product_id: int
    location_id: int


# Create schemas
class ProductCreate(ProductBase):
    pass


class LocationCreate(LocationBase):
    pass


class VendorCreate(VendorBase):
    pass


class CategoryCreate(CategoryBase):
    pass


class ProductPriceCreate(ProductPriceBase):
    pass


class ProductVendorCreate(ProductVendorBase):
    pass


class ProductLocationCreate(ProductLocationBase):
    pass


# Response schemas
class ProductOut(ProductBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class LocationOut(LocationBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class VendorOut(VendorBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class CategoryOut(CategoryBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class ProductPriceOut(ProductPriceBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class ProductVendorOut(ProductVendorBase):
    id: int
    created_at: datetime

    class Config:
        from_attributes = True


class ProductLocationOut(ProductLocationBase):
    id: int
    created_at: datetime

    class Config:
        from_attributes = True


# Detailed product response with relationships
class ProductDetailOut(ProductOut):
    product_vendors: List[ProductVendorOut] = []
    product_locations: List[ProductLocationOut] = []

    class Config:
        from_attributes = True


# API request schemas
class ProductFetchRequest(BaseModel):
    company_id: int = Field(default=2, description="Company ID for API request")
    page_number: int = Field(default=1, ge=1, description="Page number to fetch")
    page_size: int = Field(default=10, ge=1, le=100, description="Number of items per page")


# Task result schemas
class TaskResult(BaseModel):
    task_id: str
    status: str
    message: str
    data: Optional[dict] = None


# API response schemas (matching the external API structure)
class APIPrice(BaseModel):
    productPriceId: int
    fkProductId: int
    fkLocationId: int
    costPricePerUnit: float
    markupValue: float
    marginValue: float
    retailPriceExclTax: float
    compareAtPrice: float
    markupTypeName: Optional[str] = None
    marginTypeName: Optional[str] = None


class APIImage(BaseModel):
    imagePath: str


class APILocation(BaseModel):
    locationId: int
    locationName: str


class APIVendor(BaseModel):
    vendorId: int
    vendorName: str
    vendorCode: Optional[str] = None


class APIProduct(BaseModel):
    productId: int
    productName: str
    shortName: Optional[str] = None
    description: Optional[str] = None
    brandName: Optional[str] = None
    categoryName: Optional[str] = None
    fkProductCategoryId: Optional[int] = None
    eligibleForReturn: Optional[bool] = False
    displayOnPOS: Optional[bool] = False
    displayOnOnlineStore: Optional[bool] = False
    prices: Optional[List[APIPrice]] = None
    productImages: Optional[List[APIImage]] = None
    locations: Optional[List[APILocation]] = None
    vendors: Optional[List[APIVendor]] = None


class APIResponse(BaseModel):
    success: bool
    errorMessage: Optional[str] = None
    data: Optional[dict] = None


class APIData(BaseModel):
    items: List[APIProduct]
    totalRows: int