import { explicarPendiente } from './causa-pendiente';

// Fechas locales: el texto se muestra con la fecha del calendario del usuario.
const d = (s: string) => { const [y, m, dd] = s.split('-').map(Number); return new Date(y, m - 1, dd); };

describe('explicarPendiente', () => {
  it('registro creado antes de activar Contabilidad', () => {
    const r = explicarPendiente({ creadoEn: d('2026-03-01'), activacionContabilidad: d('2026-06-06'), origenTipo: null, mapeosPosteriores: [], ultimoIntento: null });
    expect(r.codigo).toBe('ANTERIOR_A_CONTABILIDAD');
    expect(r.texto).toContain('06/06/2026');
  });

  it('la categoría o concepto se mapeó después de crear el registro', () => {
    const r = explicarPendiente({
      creadoEn: d('2026-06-20'), activacionContabilidad: d('2026-06-06'), origenTipo: null,
      mapeosPosteriores: [{ nombre: 'Cheque Depositado', fecha: d('2026-07-09') }], ultimoIntento: null,
    });
    expect(r.codigo).toBe('MAPEO_POSTERIOR');
    expect(r.texto).toContain('Cheque Depositado');
    expect(r.texto).toContain('09/07/2026');
  });

  it('documento importado de Marangatu o del sistema anterior', () => {
    const r = explicarPendiente({ creadoEn: d('2026-07-01'), activacionContabilidad: d('2026-06-06'), origenTipo: null, importadoDesde: 'Marangatu', mapeosPosteriores: [], ultimoIntento: null });
    expect(r.codigo).toBe('IMPORTADO');
    expect(r.texto).toContain('Marangatu');
  });

  it('importado desde extracto bancario', () => {
    const r = explicarPendiente({ creadoEn: d('2026-07-01'), activacionContabilidad: d('2026-06-06'), origenTipo: 'IMPORT_EXTRACTO', mapeosPosteriores: [], ultimoIntento: null });
    expect(r.codigo).toBe('IMPORTACION_EXTRACTO');
  });

  it('el último intento de generarlo falló, con su error', () => {
    const r = explicarPendiente({
      creadoEn: d('2026-07-01'), activacionContabilidad: d('2026-06-06'), origenTipo: null, mapeosPosteriores: [],
      ultimoIntento: { fecha: d('2026-08-01'), error: 'No hay período abierto' },
    });
    expect(r.codigo).toBe('INTENTO_FALLIDO');
    expect(r.texto).toContain('01/08/2026');
    expect(r.texto).toContain('No hay período abierto');
  });

  it('integración auditada como OK pero sin asiento (carrera con la transacción)', () => {
    const r = explicarPendiente({ creadoEn: d('2026-07-01'), activacionContabilidad: d('2026-06-06'), origenTipo: null, mapeosPosteriores: [], ultimoIntento: null, integracionMarcadaOk: d('2026-07-01') });
    expect(r.codigo).toBe('INTEGRACION_SILENCIOSA');
    expect(r.texto).toContain('01/07/2026');
  });

  it('sin evidencia, lo dice', () => {
    const r = explicarPendiente({ creadoEn: d('2026-07-01'), activacionContabilidad: d('2026-06-06'), origenTipo: null, mapeosPosteriores: [], ultimoIntento: null });
    expect(r.codigo).toBe('SIN_REGISTRO');
  });

  it('la activación manda sobre todo lo demás', () => {
    const r = explicarPendiente({
      creadoEn: d('2026-01-01'), activacionContabilidad: d('2026-06-06'), origenTipo: 'IMPORT_EXTRACTO',
      mapeosPosteriores: [{ nombre: 'X', fecha: d('2026-07-09') }], ultimoIntento: { fecha: d('2026-08-01'), error: 'x' },
    });
    expect(r.codigo).toBe('ANTERIOR_A_CONTABILIDAD');
  });
});
