// PRUEBA DEL PDF DE LA FACTURA DEL CORREO (2026-07-31)
//
// El mismo armador que corre en la imprenta (Cloudflare) se ejercita aqui en
// local: que produzca un PDF valido con los datos del art. 7, que la marca
// (color, mensaje, logo) se sume sin romper nada, y que un logo dañado no
// tumbe la factura.
import { pdfFactura, formatoBs, controlTexto } from '../apps/validador/functions/lib/pdf_factura.js';
import { PDFDocument } from 'pdf-lib';

let fallos = 0;
const check = (cond, msg) => {
  console.log((cond ? '  OK  ' : '  XX  ') + msg);
  if (!cond) fallos++;
};

const DOCUMENTO = {
  emisor: { rif: 'J-50856106-6', razon_social: 'Arepa Power Restaurant', domicilio_fiscal: 'Av. Principal, Araure, Portuguesa' },
  cliente: { nombre: 'María Rodríguez Peña', cedula: 'V-22606827' },
  renglones: [
    { nombre: 'Arepa', cantidad: 2, precio_usd: 5, alicuota: 16, base_usd: 8.62, iva_usd: 1.38, total_usd: 10 },
    { nombre: 'Jugo de parchita', cantidad: 1, precio_usd: 2, alicuota: 0, base_usd: 2, iva_usd: 0, total_usd: 2 },
  ],
  por_alicuota: [
    { alicuota: 16, base_usd: 8.62, iva_usd: 1.38 },
    { alicuota: 0, base_usd: 2, iva_usd: 0 },
  ],
  base_usd: 10.62, iva_usd: 1.38, total_usd: 12, tasa_bs: 746.63,
  pago: { metodo: 'pago_movil', referencia: '4821' },
};

const BASE = {
  tipo: 'factura', serie: 'A', numero: 17, control: 17,
  fecha: '2026-07-31T14:22:33-04:00', fecha_asignacion: '2026-07-31T14:22:35-04:00',
  documento: DOCUMENTO,
  imprenta: { rif: 'J-11222333-4', razon_social: 'Imprenta Digital de Prueba C.A.', providencia: 'SNAT/2026/000999', providencia_fecha: '2026-01-15' },
  enlace: 'https://sello.gustitoxpress.app/v/abc123',
};

// Un PNG real de 1x1 para el logo de prueba.
const PNG_1X1 = Uint8Array.from(atob('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='), (c) => c.charCodeAt(0));

try {
  console.log('\n== 0. Los ayudantes de formato ==');
  check(formatoBs(8959.56) === '8.959,56', `bolivares con puntos y coma (${formatoBs(8959.56)})`);
  check(formatoBs(1234567.8) === '1.234.567,80', `miles de miles (${formatoBs(1234567.8)})`);
  check(controlTexto(17) === '00-00000017', `la forma del art. 30 (${controlTexto(17)})`);
  check(controlTexto(123456789) === '01-23456789', `y el lote avanza al agotarse los ocho digitos (${controlTexto(123456789)})`);

  console.log('\n== 1. El PDF sale valido, sin marca ==');
  const pelado = await pdfFactura(BASE);
  check(pelado.length > 1000, `pesa lo que un PDF (${pelado.length} bytes)`);
  check(String.fromCharCode(...pelado.subarray(0, 5)) === '%PDF-', 'y arranca como PDF');
  const doc1 = await PDFDocument.load(pelado);
  check(doc1.getPageCount() >= 1, `con sus paginas (${doc1.getPageCount()})`);

  console.log('\n== 2. Con la marca completa del negocio ==');
  const conMarca = await pdfFactura({
    ...BASE,
    marca: { mensaje_pie: 'Gracias por su compra. Síguenos en @arepapower', color: '#C9A227' },
    logo: { bytes: PNG_1X1, tipo: 'png' },
  });
  const doc2 = await PDFDocument.load(conMarca);
  check(doc2.getPageCount() >= 1, 'el PDF con marca es valido');
  check(conMarca.length > pelado.length, 'y pesa mas: trae el mensaje y el logo');

  console.log('\n== 3. Un logo dañado no tumba la factura ==');
  const logoMalo = await pdfFactura({ ...BASE, logo: { bytes: Uint8Array.from([1, 2, 3, 4]), tipo: 'png' } });
  check((await PDFDocument.load(logoMalo)).getPageCount() >= 1, 'sale igual, sin el logo');

  console.log('\n== 4. Un color invalido cae al sobrio, sin reventar ==');
  const colorMalo = await pdfFactura({ ...BASE, marca: { color: 'dorado', mensaje_pie: 'Hola' } });
  check((await PDFDocument.load(colorMalo)).getPageCount() >= 1, 'el PDF sale con el color por defecto');

  console.log('\n== 5. Muchos renglones pasan de pagina sin perderse ==');
  const largo = await pdfFactura({
    ...BASE,
    documento: {
      ...DOCUMENTO,
      renglones: Array.from({ length: 60 }, (_, i) => ({ nombre: `Producto ${i + 1}`, cantidad: 1, precio_usd: 1, alicuota: 16, base_usd: 0.86, iva_usd: 0.14, total_usd: 1 })),
    },
  });
  check((await PDFDocument.load(largo)).getPageCount() >= 2, `sesenta renglones ocupan varias paginas (${(await PDFDocument.load(largo)).getPageCount()})`);
} catch (e) {
  console.log('  XX  ' + e.message);
  fallos++;
}

console.log(fallos === 0 ? '\nPDF DE LA FACTURA: TODO VERDE' : `\n${fallos} FALLO(S)`);
process.exitCode = fallos === 0 ? 0 : 1;
