"""
Hints de cabecera para plantillas de factura (longitudes conservadoras + enums ≤3).

Valores orientativos respecto a validación en tasks.py y modelos de factura; afinar si cambian ORM.
"""
from __future__ import annotations

from typing import Any, Dict, List, Optional

from ..common.csv_hint_inject import inject_max_char_hints_into_columns, merge_enum_hint_before_max

# Unión de canónicos frecuentes en encabezados y partidas (multiplantilla)
INVOICE_MAX_CHARS_BY_CANONICAL: Dict[str, int] = {
    "NUMERO FACTURA": 100,
    "FECHA FACTURA": 30,
    "FECHA EMISION": 30,
    "TIPO DE CAMBIO": 24,
    "REGIMEN": 10,
    "PEDIMENTO": 30,
    "REMESA": 12,
    "CLAVE PROVEEDOR": 40,
    "CLAVE VENDIDO A": 40,
    "CLAVE ENVIADO A": 40,
    "AGENTE ADUANAL": 20,
    "CLAVE TRANSPORTISTA": 30,
    "NOMBRE CONDUCTOR": 80,
    "TIPO TRANSPORTE": 10,
    "CLAVE TRANSPORTE": 30,
    "NUMERO CAJA": 20,
    "NUMERO TRANSPORTE": 30,
    "TIPO MONEDA": 10,
    "CLAVE MONEDA": 10,
    "FLETES": 24,
    "VALOR SEGUROS": 24,
    "SEGUROS": 24,
    "EMBALAJES": 24,
    "OTROS INCREMENTABLES": 24,
    "CLAVE INCOTERM": 10,
    "PRECINTO": 49,
    "TIPO PESO": 10,
    "E DOCUMENT": 5,
    "NUM OPERACION": 30,
    "ADUANA DE CRUCE": 80,
    "OBSERVACIONES E": 500,
    "OBSERVACIONES I": 500,
    "FACTURA ALTERNA": 99,
    "NUM PROYECTO": 14,
    "ORDEN COMPRA": 50,
    "FACTURA EXPO REF": 19,
    "MANIFIESTO": 50,
    "ENVIADO POR": 80,
    "LINEA": 10,
    "CLASE": 20,
    "CANTIDAD IMPORTADA": 24,
    "UNIDAD DE MEDIDA": 10,
    "COSTO UNITARIO": 24,
    "PESO NETO": 24,
    "PESO BRUTO": 24,
    "CANTIDAD BULTOS": 24,
    "CLAVE BULTOS": 20,
    "PAIS ORIGEN": 3,
    "FRACCION ARANCELARIA": 20,
    "PREFERENCIA ARANCELARIA": 10,
    "SECTOR": 20,
    "FRACCION AMERICANA": 20,
    "ORDEN DE COMPRA": 50,
    "DESCRIPCION ESPAÑOL": 256,
    "DESCRIPCION INGLES": 256,
    "MARCA": 40,
    "MODELO": 40,
    "NUM. PARTE": 70,
    "SE PAGO IMPUESTO": 10,
    "FORMA DE PAGO": 30,
    "METODO DE VALORACION": 30,
    "DESCRIPCION EXTRA": 256,
    "INFORMACION ADICIONAL": 500,
    "AGREGAR/SUSTITUIR": 10,
    "TOTAL": 24,
    "NUMERO ENTRADA": 30,
    "LOTE": 40,
    "ID TYPE": 20,
    "NUMERO FACTURA EXPO": 100,
    "LINEA EXPO": 10,
    "TIPO DE IMPO": 10,
    "FACTURA IMPO": 100,
    "LINEA IMPO": 10,
    "GENERA DESCARGA": 5,
    "CANTIDAD EXPORTADA/DESCARGAR": 24,
    "AGREGAR(A)/SUSTITUIR(S)": 12,
    "ES PARTIDA O SUBPARTIDA": 10,
    "ES PARTIDA/SUBPARTIDA": 10,
    "LINEA FACTURA": 10,
    "LINEA SERIE": 10,
    "SERIE": 40,
    "NUM PARTE": 70,
    "SUB MODELO": 40,
    "NUMERO ID": 40,
}


def apply_invoice_csv_hints(template_columns: Dict[str, Optional[List[Dict[str, Any]]]]) -> None:
    """Inyecta max_chars y enums en todas las listas de columnas no nulas."""
    for _tid, cols in template_columns.items():
        if not cols:
            continue
        inject_max_char_hints_into_columns(cols, INVOICE_MAX_CHARS_BY_CANONICAL)
        for item in cols:
            c = item.get("canonical")
            if c == "E DOCUMENT":
                merge_enum_hint_before_max(item, ["S", "N"])
            elif c in ("SE PAGO IMPUESTO",):
                merge_enum_hint_before_max(item, ["SI", "NO"])
            elif c == "GENERA DESCARGA":
                merge_enum_hint_before_max(item, ["SI", "NO"])
            elif c == "TIPO DE IMPO":
                merge_enum_hint_before_max(item, ["I", "E"])
