import { formatearReferencia, normalizarReferencia } from 'src/catalogo/normalizar-referencia';
import { esTipoDocumento, interpretarTipo } from 'src/catalogo/tipos-documento';
import { CATEGORIAS, Categoria, Extraccion, INTENCIONES, Intencion } from './tipos';

export const POR_DEFECTO: Extraccion = { intencion: 'otro', tipoDocumento: null, referencia: '', categoria: 'otro' };

/** Lee la salida del extractor sin confiar en ella: lo que no está en el esquema cae a neutro. */
export function leer(json: unknown): Extraccion {
  if (!json || typeof json !== 'object') return POR_DEFECTO;
  const j = json as Record<string, unknown>;
  return {
    intencion: (INTENCIONES as readonly string[]).includes(String(j.intencion)) ? (j.intencion as Intencion) : 'otro',
    tipoDocumento: esTipoDocumento(j.tipo_documento) ? j.tipo_documento : null,
    referencia: typeof j.referencia === 'string' ? j.referencia.trim().slice(0, 100) : '',
    categoria: (CATEGORIAS as readonly string[]).includes(String(j.categoria)) ? (j.categoria as Categoria) : 'otro',
  };
}

/**
 * Atajo sin modelo: si el mensaje trae un número completo (001-001-0000123,
 * 13 dígitos) o un CDC, ya se sabe qué consultar. Ahorra la llamada al
 * extractor en el caso más común.
 */
export function extraccionDirecta(texto: string): Extraccion | null {
  const ref = normalizarReferencia(texto);
  if (!ref) return null;
  if (ref.clase === 'numero' && !(ref.establecimiento && ref.puntoExpedicion)) return null;
  return {
    intencion: 'consulta_dato',
    tipoDocumento: interpretarTipo(texto),
    referencia: formatearReferencia(ref),
    categoria: 'documento_sifen',
  };
}
