"""Esquemas de respuesta de los catálogos del SAT (solo lectura)."""

from pydantic import BaseModel, ConfigDict


class SatCatalogItem(BaseModel):
    """Forma común de todo catálogo del SAT: clave + descripción."""

    model_config = ConfigDict(from_attributes=True)

    id: int
    code: str
    description: str
    is_active: bool


class TaxRegimeResponse(SatCatalogItem):
    """``c_RegimenFiscal``: incluye a qué tipo de persona aplica el régimen."""

    applies_to_individual: bool  # persona física
    applies_to_legal_entity: bool  # persona moral


class TaxResponse(SatCatalogItem):
    """``c_Impuesto``: indica si el impuesto puede retenerse o trasladarse."""

    is_withholding: bool
    is_transferred: bool
    is_local: bool


class UnitOfMeasureResponse(SatCatalogItem):
    """``c_ClaveUnidad``: nombre corto, símbolo y nota larga del catálogo."""

    description: str | None = None
    name: str
    symbol: str | None = None


class PaymentFormResponse(SatCatalogItem):
    """``c_FormaPago``."""


class ProductServiceResponse(SatCatalogItem):
    """``c_ClaveProdServ``."""


class VoucherTypeResponse(SatCatalogItem):
    """``c_TipoDeComprobante``."""


class PaymentMethodResponse(SatCatalogItem):
    """``c_MetodoPago``."""


class TaxObjectResponse(SatCatalogItem):
    """``c_ObjetoImp``."""


class CfdiUseResponse(SatCatalogItem):
    """``c_UsoCFDI``."""
