/**
 * Simula el drill-down bucket=ingresos para un contribuyente/mes y muestra
 * cada CFDI que aparecería en el drill. Permite comparar con el total del
 * dashboard.
 */
import { prisma, tenantDb } from '../src/config/database.js';
import { resolveContribuyenteContext } from '../src/utils/contribuyente-context.js';

const tenantRfc = process.argv[2] || 'DESPACHO_MO3NI6U8_B9VGG';
const contribuyenteId = process.argv[3] || 'b3761db6-0b8d-4251-8078-4ddc31e9c75b';
const yearMonth = process.argv[4] || '2025-05';

const GRUPO_PF_EMPRESARIAL = ['606', '612', '621', '625', '626'];
const GRUPO_PM_OTROS = ['601', '603', '607', '608', '610', '611', '614', '615', '620', '622', '623', '624'];

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

  const [anio, mes] = yearMonth.split('-').map(Number);
  const lastDay = new Date(anio, mes, 0).getDate();
  const fi = `${yearMonth}-01`;
  const ff = `${yearMonth}-${String(lastDay).padStart(2, '0')}`;

  const ctx = await resolveContribuyenteContext(pool, tenant.id, contribuyenteId);
  const esEmisor = ctx.esEmisor;
  const esReceptor = ctx.esReceptor;
  const g1 = GRUPO_PF_EMPRESARIAL.map(r => `'${r}'`).join(',');
  const g3 = GRUPO_PM_OTROS.map(r => `'${r}'`).join(',');

  const FECHA_EFECTIVA = `CASE WHEN tipo_comprobante = 'P' THEN fecha_pago_p ELSE fecha_emision END`;

  // Query idéntico al drill-down bucket=ingresos
  const { rows } = await pool.query(
    `SELECT uuid, tipo_comprobante, metodo_pago,
            regimen_fiscal_emisor, regimen_fiscal_receptor,
            cfdi_tipo_relacion,
            total_mxn, monto_pago_mxn,
            fecha_emision, fecha_pago_p
       FROM cfdis
      WHERE 1=1
        AND (
          (
            ${esEmisor}
            AND regimen_fiscal_emisor IN (${g1})
            AND (
              (tipo_comprobante = 'I' AND metodo_pago = 'PUE')
              OR tipo_comprobante = 'P'
              OR (tipo_comprobante = 'E' AND metodo_pago = 'PUE' AND COALESCE(cfdi_tipo_relacion, '') <> '07')
            )
          )
          OR (
            ${esReceptor}
            AND tipo_comprobante = 'N' AND metodo_pago = 'PUE'
            AND regimen_fiscal_receptor = '605'
          )
          OR (
            ${esEmisor}
            AND regimen_fiscal_emisor IN (${g3})
            AND (
              (tipo_comprobante = 'I' AND metodo_pago IN ('PUE','PPD'))
              OR (tipo_comprobante = 'E' AND metodo_pago = 'PUE')
            )
          )
        )
        AND status NOT IN ('Cancelado','0')
        AND ${FECHA_EFECTIVA} >= $1::date
        AND ${FECHA_EFECTIVA} < ($2::date + interval '1 day')
      ORDER BY ${FECHA_EFECTIVA}`,
    [fi, ff],
  );

  console.log(`\n=== Drill bucket=ingresos  ${yearMonth} contrib=${ctx.rfc} ===`);
  console.log(`Filas: ${rows.length}\n`);
  let sumTotal = 0, sumPago = 0;
  for (const r of rows) {
    console.log(`  ${r.uuid.substring(0,8)} ${r.tipo_comprobante}${r.metodo_pago ? '/' + r.metodo_pago : ''}${r.cfdi_tipo_relacion ? ' rel=' + r.cfdi_tipo_relacion : ''} reg=${r.regimen_fiscal_emisor || r.regimen_fiscal_receptor}  total=${Number(r.total_mxn || 0).toFixed(2)}  pago=${Number(r.monto_pago_mxn || 0).toFixed(2)}`);
    sumTotal += Number(r.total_mxn || 0);
    sumPago += Number(r.monto_pago_mxn || 0);
  }
  console.log(`\nSuma total_mxn (bruto drill): ${sumTotal.toFixed(2)}`);
  console.log(`Suma monto_pago_mxn:         ${sumPago.toFixed(2)}`);
  console.log(`(Total bruto cuenta I + E a total, y P a monto_pago)`);

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