from __future__ import annotations

from datetime import date
from typing import Any, List, Optional

from pydantic import BaseModel, ConfigDict, Field

FATURA_STATUS = ("pendente", "pago", "cancelado")


class FaturaBase(BaseModel):
    """Campos aceitos no payload de criação/atualização de faturas."""

    data_vencimento: Optional[date] = Field(
        default=None,
        alias="data-vencimento",
        description="Data de vencimento (YYYY-MM-DD)",
    )
    status: str = Field(
        pattern="^(pendente|pago|cancelado)$",
        description="Status da fatura",
    )
    pedidos: Optional[str] = Field(
        default=None,
        description="Identificador do pedido relacionado à fatura",
    )

    model_config = ConfigDict(populate_by_name=True)


class FaturaCreate(FaturaBase):
    pass


class FaturaUpdate(BaseModel):
    data_vencimento: Optional[date] = Field(default=None, alias="data-vencimento")
    status: Optional[str] = Field(default=None, pattern="^(pendente|pago|cancelado)$")
    pedidos: Optional[str] = Field(default=None)

    model_config = ConfigDict(populate_by_name=True)


class FaturaOut(BaseModel):
    id: str
    data_vencimento: Optional[str] = None   # retornaremos ISO, mapeando do Appwrite
    status: str
    pedidos: Optional[Any] = None
    empresas: Optional[Any] = None
    createdAt: str
    updatedAt: str

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "id": "66fd0abca1f0xxxxxx",
                "data_vencimento": "2025-10-31",
                "status": "pendente",
                "pedidos": None,
                "empresas": None,
                "createdAt": "2025-10-01T12:00:00.000Z",
                "updatedAt": "2025-10-01T12:00:00.000Z"
            }
        }
    )


class PaginatedFaturas(BaseModel):
    items: List[FaturaOut]
    total: int

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "items": [
                    {
                        "id": "66fd0abca1f0xxxxxx",
                        "data_vencimento": "2025-10-31",
                        "status": "pendente",
                        "pedidos": None,
                        "empresas": None,
                        "createdAt": "2025-10-01T12:00:00.000Z",
                        "updatedAt": "2025-10-01T12:00:00.000Z"
                    }
                ],
                "total": 1
            }
        }
    )
