"""Catálogo CERRADO de tipos de documento que EFC acepta del CRM.

Estas 22 claves son **exactamente** las de ``TIPOS_DOCUMENTO_CRM`` en
``api/record/views_integrations_crm.py`` de EFC. La lista está duplicada a mano en dos repos con
despliegue independiente, así que ``tests/test_doc_types_paridad.py`` la fija: si alguien agrega un
tipo de un solo lado, ese test se pone rojo antes de que un documento se rechace en producción.

Por qué es un conjunto cerrado y no texto libre, a diferencia del carril de Anexo22 —que manda el
tipo suelto y deja que EFC lo resuelva por nombre—: en el CRM ``doc_type`` es ``String(60)`` /
``String(30)`` **sin validación de backend**, los catálogos viven solo en TypeScript
(``frontend/src/lib/api/crm/format.ts``). Un typo crearía un ``DocumentType`` basura en el catálogo
**global** de EFC, que es compartido por todas las organizaciones y no se limpia solo.

Las tres fuentes del CRM y su origen:

- ``crm.documents``           → ``DOC_TYPES`` de ``format.ts``
- ``ops.shipment_documents``  → ``SHIPMENT_DOC_TYPES`` del mismo archivo
- ``fin.invoices``            → el PDF de factura (``factura_venta``)

``otro`` existe en las dos listas del CRM y significa lo mismo en ambas: es una sola entrada.
"""

# --- crm.documents ---------------------------------------------------------------------------
_TIPOS_DOCUMENTOS_CLIENTE = (
    "constancia_fiscal",
    "acta_constitutiva",
    "identificacion",
    "comprobante_domicilio",
    "contrato",
    "presentacion",
    "certificacion",
    "licencia",
    "convenio",
    "tarifario",
)

# --- ops.shipment_documents ------------------------------------------------------------------
_TIPOS_DOCUMENTOS_EMBARQUE = (
    "MBL",
    "HBL",
    "MAWB",
    "HAWB",
    "CMR",
    "factura_comercial",
    "packing_list",
    "carta_encomienda",
    "carta_garantia",
    "certificado_permiso",
)

# --- fin.invoices ----------------------------------------------------------------------------
_TIPOS_FACTURACION = ("factura_venta",)

# --- común a varias fuentes -------------------------------------------------------------------
_TIPOS_COMUNES = ("otro",)

EFC_DOC_TYPES: frozenset[str] = frozenset(
    _TIPOS_DOCUMENTOS_CLIENTE + _TIPOS_DOCUMENTOS_EMBARQUE + _TIPOS_FACTURACION + _TIPOS_COMUNES
)


def is_valid_doc_type(doc_type: str | None) -> bool:
    """``True`` si EFC va a aceptar ese tipo. Se valida en el CRM para no gastar un viaje de red."""
    return bool(doc_type) and doc_type in EFC_DOC_TYPES
