from __future__ import annotations

from typing import Any, Dict, Literal

from pydantic import BaseModel, ConfigDict, Field


class PedidoBase(BaseModel):
    model_config = ConfigDict(populate_by_name=True, extra="forbid")

    status: Literal["pendente", "aprovado", "entregue", "cancelado"] = Field(alias="status")
    valor_total: float | None = Field(default=None, ge=0, alias="valor-total")
    valor_produtos: float | None = Field(default=None, ge=0, alias="valor-produtos")
    valor_frete: float | None = Field(default=None, ge=0, alias="valor-frete")
    itens: list[str] = Field(default_factory=list, alias="itens")
    quantidade: list[int] = Field(default_factory=list, alias="quantidade")
    pagamentos: str | Dict[str, Any] | None = Field(
        default=None, alias="pagamentos"
    )
    carrinhos: str | Dict[str, Any] | None = Field(default=None, alias="carrinhos")
    usuarios: str | Dict[str, Any] | None = Field(default=None, alias="usuarios")
    faturas: str | Dict[str, Any] | None = Field(default=None, alias="faturas")


class PedidoCreate(PedidoBase):
    pass


class PedidoCreateRequest(BaseModel):
    model_config = ConfigDict(populate_by_name=True, extra="forbid")

    document_id: str | None = Field(default=None, alias="documentId", min_length=1, max_length=255)
    data: PedidoCreate = Field(alias="data")


class PedidoUpdate(BaseModel):
    model_config = ConfigDict(populate_by_name=True, extra="forbid")

    status: Literal["pendente", "aprovado", "entregue", "cancelado"] | None = Field(default=None, alias="status")
    valor_total: float | None = Field(default=None, ge=0, alias="valor-total")
    valor_produtos: float | None = Field(default=None, ge=0, alias="valor-produtos")
    valor_frete: float | None = Field(default=None, ge=0, alias="valor-frete")
    itens: list[str] | None = Field(default=None, alias="itens")
    quantidade: list[int] | None = Field(default=None, alias="quantidade")
    pagamentos: str | Dict[str, Any] | None = Field(default=None, alias="pagamentos")
    carrinhos: str | Dict[str, Any] | None = Field(default=None, alias="carrinhos")
    usuarios: str | Dict[str, Any] | None = Field(default=None, alias="usuarios")
    faturas: str | Dict[str, Any] | None = Field(default=None, alias="faturas")


class PedidoStatusUpdate(BaseModel):
    status: Literal["pendente", "aprovado", "entregue", "cancelado"]


class PedidoOut(BaseModel):
    model_config = ConfigDict(from_attributes=True, populate_by_name=True)

    id: str = Field(alias="id")
    status: Literal["pendente", "aprovado", "entregue", "cancelado"] = Field(alias="status")
    valor_total: float | None = Field(alias="valor-total")
    valor_produtos: float | None = Field(alias="valor-produtos")
    valor_frete: float | None = Field(alias="valor-frete")
    itens: list[str] = Field(alias="itens")
    quantidade: list[int] = Field(alias="quantidade")
    pagamentos: str | None = Field(alias="pagamentos")
    carrinhos: str | None = Field(alias="carrinhos")
    usuarios: str | None = Field(alias="usuarios")
    faturas: str | None = Field(alias="faturas")
    created_at: str = Field(alias="createdAt")
    updated_at: str = Field(alias="updatedAt")
