/**
 * Compara paso a paso los 3 componentes del cálculo de egresos 612 en Feb 2025:
 * 1) Query exacto que usa calcularEgresosPorRegimen (con FECHA_RANGO / FECHA_PAGO_RANGO)
 * 2) Vs el drill-down usando fecha efectiva por fila
 * Detalle al CFDI para encontrar discrepancias.
 */
import { prisma, tenantDb } from '../src/config/database.js';

async function main() {
  const tenant = await prisma.tenant.findFirst({ where: { rfc: 'DESPACHO_MO3NI6U8_B9VGG' }, select: { id: true, databaseName: true } });
  if (!tenant) return;
  const pool = await tenantDb.getPool(tenant.id, tenant.databaseName);

  const fi = '2025-02-01';
  const ff = '2025-02-28';
  const contrib = 'd745a915-6a23-4818-944b-a7e1e18e536a';
  const reg = '612';
  const IMP_TRAS = `COALESCE(iva_traslado_mxn,0) + COALESCE(ieps_traslado_mxn,0) + COALESCE(impuestos_locales_trasladado_mxn,0)`;
  const IMP_TRAS_PAGO = `COALESCE(iva_traslado_pago_mxn,0) + COALESCE(ieps_traslado_pago_mxn,0)`;
  const EXCL = `COALESCE((SELECT SUM(COALESCE(cc.importe_mxn,0) - COALESCE(cc.descuento_mxn,0)) FROM cfdi_conceptos cc WHERE cc.cfdi_id = cfdis.id AND cc.clave_prod_serv IN ('84121603','93161608','85101501','85121800')), 0)`;

  // QUERY 1 FACTURAS (idéntico a calcularEgresosPorRegimen)
  const f = await pool.query(
    `SELECT uuid, total_mxn, (${IMP_TRAS}) AS imp, (${EXCL}) AS excl,
            COALESCE(total_mxn,0) - (${IMP_TRAS}) - (${EXCL}) AS neto,
            cfdi_tipo_relacion AS rel
       FROM cfdis
      WHERE type='RECIBIDO' AND tipo_comprobante='I' AND metodo_pago='PUE'
        AND status NOT IN ('Cancelado','0')
        AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day')
        AND regimen_fiscal_receptor = $3
        AND contribuyente_id = $4
      ORDER BY fecha_emision`,
    [fi, ff, reg, contrib],
  );
  const sumF = f.rows.reduce((s, r) => s + Number(r.neto), 0);
  console.log(`FACTURAS I PUE reg=${reg}: n=${f.rows.length}  sum_neto=${sumF.toFixed(2)}`);

  // QUERY 2 PAGOS P
  const p = await pool.query(
    `SELECT uuid, monto_pago_mxn, (${IMP_TRAS_PAGO}) AS imp,
            COALESCE(monto_pago_mxn,0) - (${IMP_TRAS_PAGO}) AS neto,
            fecha_pago_p, fecha_emision
       FROM cfdis
      WHERE type='RECIBIDO' AND tipo_comprobante='P'
        AND status NOT IN ('Cancelado','0')
        AND fecha_pago_p >= $1::date AND fecha_pago_p < ($2::date + interval '1 day')
        AND regimen_fiscal_receptor = $3
        AND contribuyente_id = $4
      ORDER BY fecha_pago_p`,
    [fi, ff, reg, contrib],
  );
  const sumP = p.rows.reduce((s, r) => s + Number(r.neto), 0);
  console.log(`PAGOS P reg=${reg} (fecha_pago_p): n=${p.rows.length}  sum_neto=${sumP.toFixed(2)}`);

  // También probar con fecha_emision del P (alternativo)
  const pEmis = await pool.query(
    `SELECT uuid, COALESCE(monto_pago_mxn,0) - (${IMP_TRAS_PAGO}) AS neto,
            fecha_pago_p, fecha_emision
       FROM cfdis
      WHERE type='RECIBIDO' AND tipo_comprobante='P'
        AND status NOT IN ('Cancelado','0')
        AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day')
        AND regimen_fiscal_receptor = $3
        AND contribuyente_id = $4
      ORDER BY fecha_emision`,
    [fi, ff, reg, contrib],
  );
  const sumPe = pEmis.rows.reduce((s, r) => s + Number(r.neto), 0);
  console.log(`  (alt) PAGOS P filtrados por fecha_emision: n=${pEmis.rows.length}  sum_neto=${sumPe.toFixed(2)}`);

  // QUERY 3 NC
  const n = await pool.query(
    `SELECT uuid, total_mxn, (${IMP_TRAS}) AS imp, (${EXCL}) AS excl,
            COALESCE(total_mxn,0) - (${IMP_TRAS}) - (${EXCL}) AS neto,
            cfdi_tipo_relacion AS rel
       FROM cfdis
      WHERE type='RECIBIDO' AND tipo_comprobante='E' AND metodo_pago='PUE'
        AND COALESCE(cfdi_tipo_relacion,'') <> '07'
        AND status NOT IN ('Cancelado','0')
        AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day')
        AND regimen_fiscal_receptor = $3
        AND contribuyente_id = $4`,
    [fi, ff, reg, contrib],
  );
  const sumN = n.rows.reduce((s, r) => s + Number(r.neto), 0);
  console.log(`NC E PUE excl 07 reg=${reg}: n=${n.rows.length}  sum_neto=${sumN.toFixed(2)}`);

  console.log(`\nTotal ON-THE-FLY (reg 612): ${(sumF + sumP - sumN).toFixed(2)}`);
  console.log(`Cache dice:                   446180.10`);
  console.log(`Delta:                        ${((sumF + sumP - sumN) - 446180.10).toFixed(2)}`);

  // Detalle de los P para investigar — fecha_emision vs fecha_pago_p
  console.log(`\nDetalle PAGOS P (filtrados por fecha_pago_p):`);
  for (const r of p.rows) {
    console.log(`  ${r.uuid.substring(0,8)}  monto=${Number(r.monto_pago_mxn).toFixed(2)}  neto=${Number(r.neto).toFixed(2)}  fecha_pago_p=${r.fecha_pago_p?.toISOString?.()?.slice(0,10)}  fecha_emision=${r.fecha_emision?.toISOString?.()?.slice(0,10)}`);
  }

  await prisma.$disconnect();
}
main().catch(async e => { console.error(e); await prisma.$disconnect().catch(() => {}); process.exit(1); });
