import { clasificarEnvioCorreo } from './clasificar-envio-correo';
import {
  clasificarMensajeSifen,
  diagnosticoDeAlerta,
  esAmbienteTest,
  textoDelMensaje,
} from './clasificar-mensaje-sifen';

// Mensajes reales de factura_cab / nota_credito_cab (copias locales de producción).
describe('clasificarMensajeSifen', () => {
  it.each([
    ['Documento electrónico duplicado', 'duplicado'],
    [
      'Middleware SIFEN error 400: {"status":"error","message":"No se encontraron datos de la empresa para validar el lote"}',
      'empresa_no_en_hub',
    ],
    [
      'No se pudo consultar el evento en el middleware: login al middleware: Middleware SIFEN login error 400: {"status":"error","message":"Usuario no válido"}',
      'empresa_no_en_hub',
    ],
    ['La fecha y hora de la firma digital es adelantada', 'falla_plataforma'],
    ['Error Inesperado', 'falla_transitoria'],
    ['0100 - Error inesperado en el servicio', 'falla_transitoria'],
    ['Error de PKI al validar la firma', 'falla_transitoria'],
    ['Timeout al conectar al servicio de sifen (envio de lote)', 'falla_transitoria'],
    ['El certificado digital se encuentra vencido', 'certificado'],
    ['TEST - Código de actividad económica incorrecto', 'dato_cliente'],
    ['TEST - RUC del receptor inexistente en la base de datos de Marangatu', 'dato_cliente'],
    ['El Departamento, el Distrito y la Ciudad del receptor no están relacionados', 'dato_cliente'],
    ['El CDC informado corresponde a un DTE cancelado', 'dato_cliente'],
    ['', 'sin_mensaje'],
    [null, 'sin_mensaje'],
  ])('%s → %s', (mensaje, clase) => {
    expect(clasificarMensajeSifen(mensaje)).toBe(clase);
  });

  it('un número cualquiera no se confunde con el código 0100', () => {
    expect(clasificarMensajeSifen('RUC 80100123 del receptor inexistente')).toBe('dato_cliente');
  });
});

describe('textoDelMensaje', () => {
  it('saca el prefijo TEST', () => {
    expect(textoDelMensaje('TEST - Código de actividad económica incorrecto')).toBe(
      'Código de actividad económica incorrecto',
    );
    expect(esAmbienteTest('TEST - Código de actividad económica incorrecto')).toBe(true);
    expect(esAmbienteTest('Documento electrónico duplicado')).toBe(false);
  });

  it('extrae el motivo de un error del middleware con JSON', () => {
    expect(
      textoDelMensaje(
        'Middleware SIFEN error 400: {"status":"error","message":"No se encontraron datos de la empresa para validar el lote"}',
      ),
    ).toBe('No se encontraron datos de la empresa para validar el lote');
  });

  it('prefiere el dMsgRes de SIFEN sobre el mensaje genérico', () => {
    const m =
      'Middleware SIFEN error 400: {"status":"error","message":"Se detectaron valores inválidos en algunos documentos",' +
      '"response":{"rechazos":[{"dMsgRes":"El RUC del receptor no existe"}]}}';
    expect(textoDelMensaje(m)).toBe('El RUC del receptor no existe');
  });

  it('con JSON truncado usa lo que encuentra', () => {
    const truncado =
      'Middleware SIFEN error 400: {"status":"error","message":"Se detectaron valores inválidos en algunos documentos","aceptados":0,"rechazados":1,"response":{"Acepta';
    expect(textoDelMensaje(truncado)).toBe('Se detectaron valores inválidos en algunos documentos');
  });

  it('null si no hay mensaje', () => {
    expect(textoDelMensaje('  ')).toBeNull();
  });
});

describe('clasificarEnvioCorreo', () => {
  it.each([
    ['Enviado', 'enviado'],
    ['Pendiente', 'pendiente'],
    ['No enviado', 'no_enviado'],
    ['Error: No recipients defined', 'sin_destinatario'],
    ['Error: Connection timeout', 'falla_envio'],
    [
      'Error: Invalid login: 535-5.7.8 Username and Password not accepted. For more information, go to 535 5.7.8 https://support.google.com/mail/?p=BadCredentials',
      'credenciales_smtp',
    ],
    ['Error: algo raro', 'error'],
    [null, 'sin_dato'],
  ])('%s → %s', (valor, estado) => {
    expect(clasificarEnvioCorreo(valor)).toBe(estado);
  });
});

describe('diagnóstico de alertas', () => {
  it('el login rechazado por el middleware lo resuelve Novasis, no el cliente', () => {
    const d = diagnosticoDeAlerta(
      'No se pudo consultar el evento en el middleware: login al middleware: Middleware SIFEN login error 400: {"status":"error","message":"Usuario no válido"}',
    );
    expect(d).toMatchObject({ lo_resuelve: 'novasis', requiere_novasis: true });
  });

  it('una alerta común no trae diagnóstico', () => {
    expect(diagnosticoDeAlerta('El timbrado vence en 15 días')).toBeNull();
  });
});
