/**
 * Por qué un registro quedó sin asiento. La conciliación detecta QUÉ falta;
 * esto explica POR QUÉ no se generó solo, que es lo primero que pregunta la
 * empresa cuando ve cientos de pendientes ("¿el sistema falló?").
 *
 * Es una causa probable reconstruida con evidencia (fechas de activación y de
 * mapeos, intentos registrados). Cuando no hay evidencia, se dice.
 */

export type CausaPendiente =
  | 'ANTERIOR_A_CONTABILIDAD'
  | 'IMPORTADO'
  | 'MAPEO_POSTERIOR'
  | 'IMPORTACION_EXTRACTO'
  | 'INTENTO_FALLIDO'
  | 'INTEGRACION_SILENCIOSA'
  | 'SIN_REGISTRO';

export interface ExplicacionPendiente {
  codigo: CausaPendiente;
  texto: string;
}

export interface EvidenciaPendiente {
  /** Cuándo se creó el registro operativo (no su fecha contable). */
  creadoEn: Date | null;
  /** Cuándo se activó el módulo Contabilidad para la empresa. */
  activacionContabilidad: Date | null;
  origenTipo: string | null;
  /** Documento traído por importación (Marangatu, sistema anterior): no pasó por el flujo que asienta. */
  importadoDesde?: string | null;
  /** Categorías/conceptos que el registro necesita y se mapearon después de crearlo. */
  mapeosPosteriores: Array<{ nombre: string; fecha: Date }>;
  /** Último intento registrado de generarle asiento que falló. */
  ultimoIntento: { fecha: Date; error: string } | null;
  /**
   * La integración en tiempo real quedó auditada como exitosa pero no dejó
   * asiento (bug de sincronización con la transacción, corregido el 21/09/2026).
   */
  integracionMarcadaOk?: Date | null;
}

const fmt = (d: Date) =>
  `${String(d.getDate()).padStart(2, '0')}/${String(d.getMonth() + 1).padStart(2, '0')}/${d.getFullYear()}`;

export function explicarPendiente(e: EvidenciaPendiente): ExplicacionPendiente {
  if (e.creadoEn && e.activacionContabilidad && e.creadoEn < e.activacionContabilidad) {
    return {
      codigo: 'ANTERIOR_A_CONTABILIDAD',
      texto: `Se creó el ${fmt(e.creadoEn)}, antes de activar Contabilidad (${fmt(e.activacionContabilidad)}). En ese momento no se generaban asientos.`,
    };
  }

  if (e.importadoDesde) {
    return {
      codigo: 'IMPORTADO',
      texto: `Importado desde ${e.importadoDesde}. Los documentos importados no pasan por la emisión, que es donde se genera el asiento: se contabilizan desde acá.`,
    };
  }

  if (e.mapeosPosteriores.length > 0) {
    const ultimo = e.mapeosPosteriores.reduce((a, b) => (b.fecha > a.fecha ? b : a));
    const nombres = e.mapeosPosteriores.map((m) => `"${m.nombre}"`).join(', ');
    return {
      codigo: 'MAPEO_POSTERIOR',
      texto: `Cuando se creó, ${nombres} no tenía cuenta contable asignada, así que el asiento se omitió. El mapeo se cargó el ${fmt(ultimo.fecha)}.`,
    };
  }

  if (e.origenTipo === 'IMPORT_EXTRACTO') {
    return {
      codigo: 'IMPORTACION_EXTRACTO',
      texto: 'Importado desde el extracto bancario. La importación masiva no genera asientos automáticamente: se contabiliza desde acá.',
    };
  }

  if (e.integracionMarcadaOk) {
    return {
      codigo: 'INTEGRACION_SILENCIOSA',
      texto: `El ${fmt(e.integracionMarcadaOk)} el sistema registró la contabilización como exitosa, pero el asiento no llegó a generarse: la integración corría antes de que el recibo quedara confirmado en la base (error corregido el 21/09/2026). Se contabiliza desde acá.`,
    };
  }

  if (e.ultimoIntento) {
    return {
      codigo: 'INTENTO_FALLIDO',
      texto: `El último intento de generarle asiento (${fmt(e.ultimoIntento.fecha)}) falló: ${e.ultimoIntento.error}`,
    };
  }

  return {
    codigo: 'SIN_REGISTRO',
    texto: 'No quedó registrado por qué no se generó en su momento. Lo que sí está verificado es que hoy no tiene asiento.',
  };
}
