import { MiddlewareSifenService } from './middleware-sifen.service';

/**
 * SIFEN responde 4003 ("CDC ya se encuentra con el mismo evento solicitado")
 * cuando el evento ya está registrado. Es confirmación, no rechazo.
 *
 * Caso real: la factura 001-001-0002374 de DOBA se canceló en e-kuatia a las
 * 17:20 y el ERP reintentó el ECAN a las 17:40. SIFEN contestó 4003, el ERP lo
 * guardó como Rechazado y la factura siguió vigente con Gs. 396.000 de saldo —
 * además de quedar fuera del set de reintentos del job.
 */
describe('MiddlewareSifenService - 4003 vale como evento aplicado', () => {
  const crear = () => {
    const service = Object.create(MiddlewareSifenService.prototype) as any;
    service.logger = { log: jest.fn(), warn: jest.fn(), error: jest.fn(), debug: jest.fn() };
    return service;
  };

  it('reconoce el 4003 por código de respuesta', () => {
    expect(crear().eventoYaRegistrado('4003', 'cualquier cosa')).toBe(true);
  });

  it('reconoce el mensaje aunque no venga el código', () => {
    const s = crear();
    expect(s.eventoYaRegistrado(null, 'CDC ya se encuentra con el mismo evento solicitado')).toBe(true);
    // Sin distinguir mayúsculas, que SIFEN no es consistente.
    expect(s.eventoYaRegistrado(undefined, 'CDC YA SE ENCUENTRA CON EL MISMO EVENTO SOLICITADO')).toBe(true);
  });

  it('no confunde un rechazo real con el 4003', () => {
    const s = crear();
    expect(s.eventoYaRegistrado('0600', 'Evento registrado correctamente')).toBe(false);
    expect(s.eventoYaRegistrado('4002', 'CDC no encontrado')).toBe(false);
    expect(s.eventoYaRegistrado(null, null)).toBe(false);
    expect(s.eventoYaRegistrado('', '')).toBe(false);
  });

  it('tolera el código con espacios, como viene a veces del middleware', () => {
    expect(crear().eventoYaRegistrado(' 4003 ', null)).toBe(true);
  });
});
