import { MarangatuSyncService } from '../marangatu-sync.service';

/**
 * El mapeo del DE que devuelve SIFEN es el punto frágil de la recuperación por CDC:
 * si un campo sale mal, se cargan comprobantes con número o RUC incorrecto y hay que
 * borrarlos a mano. Estos casos cubren lo que efectivamente se rompe: ceros a la
 * izquierda que un parser "inteligente" convierte a número, y el ruteo factura vs NC.
 */
describe('MarangatuSyncService — documentoDesdeXmlSifen', () => {
  const service = new MarangatuSyncService(null as any, null as any, null as any, null as any);
  const mapear = (cdc: string, xml: string) => (service as any).documentoDesdeXmlSifen(cdc, { xml_documento: xml, estado: 'Aprobado' });

  const de = (iTiDE: number, extra = '') => `<?xml version="1.0" encoding="UTF-8"?>
<rDE xmlns="http://ekuatia.set.gov.py/sifen/xsd">
  <DE Id="01801443156001001000111922025080114299041803">
    <gTimb>
      <iTiDE>${iTiDE}</iTiDE>
      <dDesTiDE>${iTiDE === 5 ? 'Nota de crédito electrónica' : 'Factura electrónica'}</dDesTiDE>
      <dNumTim>12558946</dNumTim>
      <dEst>001</dEst>
      <dPunExp>001</dPunExp>
      <dNumDoc>0001192</dNumDoc>
    </gTimb>
    <gDatGralOpe>
      <dFeEmiDE>2025-08-01T14:29:04</dFeEmiDE>
      <gOpeCom><cMoneOpe>PYG</cMoneOpe></gOpeCom>
      <gEmis>
        <dRucEm>80144315</dRucEm>
        <dDVEmi>6</dDVEmi>
        <dNomEmi>DOBA S.A.</dNomEmi>
      </gEmis>
      <gDatRec>
        <dRucRec>80012345</dRucRec>
        <dDVRec>7</dDVRec>
        <dNomRec>CLIENTE EJEMPLO S.R.L.</dNomRec>
      </gDatRec>
    </gDatGralOpe>
    <gTotSub><dTotGralOpe>1500000</dTotGralOpe></gTotSub>${extra}
  </DE>
</rDE>`;

  it('mapea una factura conservando los ceros a la izquierda del número', () => {
    const doc = mapear('01801443156001001000111922025080114299041803', de(1));

    expect(doc).not.toBeNull();
    // Lo crítico: '001-001-0001192', no '1-1-1192'.
    expect(doc.numeroComprobante).toBe('001-001-0001192');
    expect(doc.tipoComprobante).toBe('Factura electrónica');
    expect(doc.fechaEmision).toBe('2025-08-01');
    expect(doc.moneda).toBe('PYG');
    // El importador resuelve el cliente como `rucVendedor ?? rucReceptor`. En una venta
    // la contraparte es el receptor, asi que los campos de vendedor tienen que venir
    // vacios: si no, el cliente creado termina siendo la propia empresa emisora.
    expect(doc.rucVendedor).toBeNull();
    expect(doc.razonSocialVendedor).toBeNull();
    expect(doc.rucReceptor).toBe('80012345');
    expect(doc.razonSocialReceptor).toBe('CLIENTE EJEMPLO S.R.L.');
    // Sin DV: personas.ruc es VarChar(8) y '80012345-7' no entra.
    expect(doc.rucReceptor).not.toContain('-');
    expect(doc.rucReceptor.length).toBeLessThanOrEqual(8);
    expect(doc.rucEmisor).toBe('80144315');
    expect(doc.estadoSifen).toBe('Aprobado');
    // procesarVentas lee el DE por acá; si no cuelga en xmlParsed.DE, no importa nada.
    expect(doc.xmlParsed.DE.gTimb.iTiDE).toBe('1');
  });

  it('marca las notas de crédito para que se ruteen al importador de NC', () => {
    const doc = mapear('01801443156001001000111922025080114299041804', de(5));

    expect(doc.tipoComprobante).toBe('NOTA DE CREDITO');
    expect(Number(doc.xmlParsed.DE.gTimb.iTiDE)).toBe(5);
  });

  it('devuelve null si el XML no es un DE, en vez de importar basura', () => {
    expect(mapear('x', '<rDE><DE></DE></rDE>')).toBeNull();
    expect(mapear('x', 'no soy xml <<<')).toBeNull();
  });
});
