// PRUEBA DEL IGTF PROGRAMADO Y APAGADO (2026-07-30)
//
// Solo los designados sujetos pasivos especiales perciben IGTF (Providencia
// 000013). El modulo existe para el dia que llegue esa designacion y NI UN DIA
// ANTES: apagado no toca nada, encendido percibe 3% SOLO en pagos en divisas,
// y la nota de credito lo devuelve. Zelle es divisa por definicion; el
// efectivo no se adivina (solo si la venta lo dice explicito).
import { armarDocumento, armarNotaCredito } from '../dist/armador.js';

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

const EMISOR_APAGADO = {
  rif: 'J-50856106-6',
  razon_social: 'Prueba',
  domicilio_fiscal: 'Araure',
  precios_con_iva: true,
};
const EMISOR_DESIGNADO = { ...EMISOR_APAGADO, igtf_activo: true };

const venta = (pago) => ({
  origen_id: 'igtf-1',
  canal: 'caja',
  cliente: { nombre: 'Consumidor final' },
  renglones: [{ nombre: 'Parrilla', cantidad: 1, precio_usd: 100, alicuota: 16 }],
  tasa_bs: 700,
  pago,
});

console.log('\n== 1. Apagado (lo normal): cero IGTF aunque paguen en divisas ==');
const d1 = armarDocumento(venta({ metodo: 'zelle' }), EMISOR_APAGADO);
check(d1.igtf_usd === undefined, 'zelle sin designacion: el documento no trae IGTF');
check(d1.total_usd === 100, `y el total queda intacto (${d1.total_usd})`);

console.log('\n== 2. Encendido: percibe 3% SOLO en pagos en divisas ==');
const d2 = armarDocumento(venta({ metodo: 'zelle' }), EMISOR_DESIGNADO);
check(d2.igtf_usd === 3, `zelle: IGTF de 3% (${d2.igtf_usd})`);
check(d2.total_usd === 100, 'el total de la venta NO se contamina: el IGTF va aparte');
const d3 = armarDocumento(venta({ metodo: 'pago_movil' }), EMISOR_DESIGNADO);
check(d3.igtf_usd === undefined, 'pago movil (bolivares): cero IGTF');

console.log('\n== 3. El efectivo no se adivina ==');
const d4 = armarDocumento(venta({ metodo: 'efectivo' }), EMISOR_DESIGNADO);
check(d4.igtf_usd === undefined, 'efectivo sin marcar: no se asume divisa');
const d5 = armarDocumento(venta({ metodo: 'efectivo', en_divisas: true }), EMISOR_DESIGNADO);
check(d5.igtf_usd === 3, 'efectivo marcado en_divisas: si percibe (3)');
const d6 = armarDocumento(venta({ metodo: 'zelle', en_divisas: false }), EMISOR_DESIGNADO);
check(d6.igtf_usd === undefined, 'y lo explicito manda: zelle marcado como NO divisa, cero IGTF');

console.log('\n== 4. La nota de credito devuelve el IGTF tambien ==');
const nc = armarNotaCredito(d5, 'prueba');
check(nc.igtf_usd === -3, `la nota trae el IGTF en negativo (${nc.igtf_usd})`);
const ncSin = armarNotaCredito(d1, 'prueba');
check(ncSin.igtf_usd === undefined, 'y si la factura no lo tenia, la nota tampoco');

console.log('\n== 5. Sin pago declarado, jamas hay IGTF ==');
const d7 = armarDocumento(venta(null), EMISOR_DESIGNADO);
check(d7.igtf_usd === undefined, 'venta sin pago: cero IGTF');

console.log(fallos === 0 ? '\nTODO EN VERDE' : `\n${fallos} FALLOS`);
process.exit(fallos ? 1 : 0);
