import { alertaDeEvento, claveAlertaEvento } from './alerta-evento-sifen';

describe('alertaDeEvento', () => {
  const doc = { id: 'fac-1', dest: '001', dpunexp: '002', dnumdoc: '0000552', evento_aplicado: 'EINU' };

  it('arma la clave de deduplicación por tipo y documento', () => {
    expect(claveAlertaEvento('factura', 'fac-1')).toBe('sifen_evento:factura:fac-1');
  });

  it('un evento que SIFEN no registró es de criticidad alta y apunta a la factura', () => {
    const a = alertaDeEvento({
      empresaId: 'emp-1',
      tipoDocumento: 'factura',
      doc,
      caso: 'no_registrado',
      detalle: 'El middleware no lo tiene.',
      sucursalId: 'suc-1',
    });

    expect(a).toMatchObject({
      empresaId: 'emp-1',
      clave: 'sifen_evento:factura:fac-1',
      tipo: 'sifen_evento',
      criticidad: 'alta',
      modulo: 'FISCAL',
      privilegioRequerido: 'FIS_SIF_SIFEN_VER',
      sucursalId: 'suc-1',
      entidadTipo: 'factura',
      entidadId: 'fac-1',
      origen: 'sistema',
      ruta: '/ventas?tab=facturas&buscar=001-002-0000552',
    });
    expect(a.titulo).toContain('inutilización');
    expect(a.titulo).toContain('001-002-0000552');
    expect(a.datos).toMatchObject({ caso: 'no_registrado', tipoDocumento: 'factura', documentoId: 'fac-1', evento: 'EINU' });
  });

  it('incoherente también es alta', () => {
    const a = alertaDeEvento({ empresaId: 'e', tipoDocumento: 'factura', doc, caso: 'incoherente', detalle: 'x', sucursalId: null });
    expect(a.criticidad).toBe('alta');
  });

  it('sin respuesta y falla del middleware son media', () => {
    for (const caso of ['sin_respuesta', 'middleware_falla'] as const) {
      const a = alertaDeEvento({ empresaId: 'e', tipoDocumento: 'factura', doc, caso, detalle: 'x', sucursalId: null });
      expect(a.criticidad).toBe('media');
    }
  });

  it('la ruta depende del tipo de documento', () => {
    const nc = alertaDeEvento({ empresaId: 'e', tipoDocumento: 'nota_credito', doc: { ...doc, evento_aplicado: 'ECAN' }, caso: 'sin_respuesta', detalle: 'x', sucursalId: null });
    const nr = alertaDeEvento({ empresaId: 'e', tipoDocumento: 'nota_remision', doc: { ...doc, evento_aplicado: 'ECAN' }, caso: 'sin_respuesta', detalle: 'x', sucursalId: null });
    expect(nc.ruta).toBe('/ventas?tab=notas-credito&buscar=001-002-0000552');
    expect(nr.ruta).toBe('/ventas?tab=remisiones&buscar=001-002-0000552');
    expect(nc.titulo).toContain('cancelación');
  });
});
