"""
Product Category schema definitions for common operations.
"""

from datetime import datetime
from typing import Optional, List
from pydantic import Field, ConfigDict, field_validator, BaseModel
from src.apps.base.schemas.common import BaseSchema


class ProductCategoryBase(BaseSchema):
    """Base product category schema."""
    
    name: str = Field(..., description="Category name")
    code: str = Field(..., max_length=255, description="Category code")
    slug: str = Field(..., description="Category slug")
    description: Optional[str] = Field(None, description="Category description")
    order: Optional[int] = Field(None, description="Category display order")
    is_active: bool = Field(True, description="Whether the category is active")
    parent_id: Optional[int] = Field(None, description="Parent category ID")
    merchant_id: Optional[int] = Field(None, description="Associated merchant ID")


class ProductCategoryResponseSchema(ProductCategoryBase):
    """Product category response schema."""
    
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(..., description="Category's unique identifier")
    created_at: datetime = Field(..., description="When the category was created")
    updated_at: Optional[datetime] = Field(None, description="When the category was last updated")
    deleted_at: Optional[datetime] = Field(None, description="When the category was soft deleted")


class ProductCategoryCreateSchema(BaseSchema):
    """Schema for creating a new product category."""
    
    # Required fields for creation
    name: str = Field(..., max_length=500, description="Category name (required)")
    code: str = Field(..., max_length=255, description="Category code (required)")
    slug: Optional[str] = Field(None, description="Category slug (auto-generated if not provided)")
    description: Optional[str] = Field(None, description="Category description")
    order: Optional[int] = Field(None, description="Category display order")
    is_active: bool = Field(True, description="Whether the category is active")
    parent_id: Optional[int] = Field(None, description="Parent category ID")
    merchant_id: Optional[int] = Field(None, description="Associated merchant ID")


class ProductCategoryUpdateSchema(BaseSchema):
    """Schema for updating product category information - all fields are optional for partial updates."""
    
    # Make all fields optional for updates
    name: Optional[str] = Field(None, max_length=500, description="Category name")
    code: Optional[str] = Field(None, max_length=255, description="Category code")
    slug: Optional[str] = Field(None, description="Category slug")
    description: Optional[str] = Field(None, description="Category description")
    order: Optional[int] = Field(None, description="Category display order")
    is_active: Optional[bool] = Field(None, description="Whether the category is active")
    parent_id: Optional[int] = Field(None, description="Parent category ID")
    merchant_id: Optional[int] = Field(None, description="Associated merchant ID")


class ProductCategoryListItemSchema(BaseSchema):
    """Simplified product category schema for list views."""
    
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(..., description="Category's unique identifier")
    name: str = Field(..., description="Category name")
    code: str = Field(..., description="Category code")
    slug: str = Field(..., description="Category slug")
    description: Optional[str] = Field(None, description="Category description")
    order: Optional[int] = Field(None, description="Category display order")
    is_active: bool = Field(..., description="Whether the category is active")
    parent_id: Optional[int] = Field(None, description="Parent category ID")
    created_at: datetime = Field(..., description="When the category was created")


class ProductCategoryBulkDeleteSchema(BaseSchema):
    """Schema for bulk deleting product categories."""
    
    category_ids: List[int] = Field(..., min_length=1, description="List of category IDs to delete")
    
    @field_validator('category_ids')
    @classmethod
    def validate_category_ids(cls, v):
        """Validate category IDs list."""
        if not v:
            raise ValueError("At least one category ID is required")
        if len(v) > 100:  # Reasonable limit for bulk operations
            raise ValueError("Cannot delete more than 100 categories at once")
        return v


class ProductCategoryListFilterSchema(BaseModel):
    """Schema for filtering product category list queries."""
    
    search: Optional[str] = Field(None, description="Search across name, code, description")
    name: Optional[str] = Field(None, description="Filter by category name")
    code: Optional[str] = Field(None, description="Filter by code")
    merchant_id: Optional[int] = Field(None, description="Filter by merchant ID")
    parent_id: Optional[int] = Field(None, description="Filter by parent category ID")
    is_active: int = Field(0, description="Filter by active status (0=all, 1=active, -1=inactive)")
    
    @field_validator('is_active')
    @classmethod
    def validate_boolean_filters(cls, v):
        """Validate boolean filter values."""
        if v not in [-1, 0, 1]:
            raise ValueError("Boolean filters must be -1 (false), 0 (all), or 1 (true)")
        return v