from __future__ import annotations

from typing import Any, Optional, List

from pydantic import BaseModel, ConfigDict, Field


class CategoriaBase(BaseModel):
    nome: str = Field(min_length=1, max_length=255, description="Nome da categoria")
    slug: str | None = Field(default=None, max_length=255, description="Slug URL-friendly (opcional)")


class CategoriaCreate(CategoriaBase):
    """Payload para criar categoria."""


class CategoriaUpdate(BaseModel):
    """Payload para atualizar categoria (parcial)."""

    nome: str | None = Field(default=None, min_length=1, max_length=255)
    slug: str | None = Field(default=None, max_length=255)


class CategoriaOut(BaseModel):
    """Representação da categoria retornada pela API."""

    id: str
    nome: str
    slug: str | None
    subcategorias: Optional[Any] = None
    produtos_catalogo: Optional[Any] = None
    createdAt: str
    updatedAt: str

    model_config = ConfigDict(
        from_attributes=True,
        json_schema_extra={
            "example": {
                "id": "66fcb3d8a9c0xxxxxx",
                "nome": "Analgésicos",
                "slug": "analgesicos",
                "subcategorias": None,
                "produtos_catalogo": None,
                "createdAt": "2025-09-29T12:00:00.000Z",
                "updatedAt": "2025-09-29T12:00:00.000Z",
            }
        },
    )


class PaginatedCategorias(BaseModel):
    """Envelope de paginação padrão da listagem."""

    items: List[CategoriaOut]
    total: int

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "items": [
                    {
                        "id": "66fcb3d8a9c0xxxxxx",
                        "nome": "Analgésicos",
                        "slug": "analgesicos",
                        "subcategorias": None,
                        "produtos_catalogo": None,
                        "createdAt": "2025-09-29T12:00:00.000Z",
                        "updatedAt": "2025-09-29T12:00:00.000Z",
                    }
                ],
                "total": 1,
            }
        }
    )
