from typing import Optional, List
from pydantic import BaseModel, Field
from .common import Pagination

# ---------- Core DTOs (request/response) ----------

# Request model for fetching category by ID
class CategoryIdRequest(BaseModel):
    category_id: int

# Request model for fetching category by ID
class CategoryIdRequest(BaseModel):
    category_id: int

class CategoryBase(BaseModel):    
    name: str = Field(..., max_length=255)
    slug: Optional[str] = None
    description: Optional[str] = None
    thumbnail_url: Optional[str] = None
    is_active: bool = True
    sort_order: int = 0
    is_free: bool = False
    is_popular: bool = False

class CategoryCreate(CategoryBase):
    pass

# What we read from DB (includes id)
class CategoryInDB(CategoryBase):
    category_id: int

# What we expose out of the API (decrypted payload)
class CategoryOut(BaseModel):
    category_id: int
    name: str
    description: Optional[str] = None
    is_active: bool
    is_free: bool
    is_popular: bool
    sort_order: int

# ---------- Helper request DTOs for your encrypted flow ----------

class CategoryIdRequest(BaseModel):
    category_id: int

class CategoryQuery(BaseModel):
    """
    This is the *decrypted* payload your /categories POST uses.
    The actual HTTP body is encrypted; once decrypted, validate using this.
    """
    tag: str = Field("all", description="one of: all, free, popular, pro")
    search: Optional[str] = None
    page: int = Field(1, ge=1)
    limit: int = Field(10, ge=1, le=100)

# ---------- Aggregated response payload (decrypted) ----------

class CategoriesPayload(BaseModel):
    items: List[CategoryOut]
    pagination: Pagination
