/**
 * One-shot: corrige dos registros que quedaron mal en la primera corrida de
 * migrate-facturas-proveedor-taller.ts, antes de que el script supiera
 * desempatar facturas repetidas y saltear las de total 0.
 *
 *  1. La factura 002-002-0033972 (Gs. 215.000) viene dos veces en el CSV: una
 *     contra "AHORA SOCIEDAD ANONIMA" (RUC 80068721-3) y otra contra el comodín
 *     "GENERICO" (RUC 800). Ganó la que aparecía primero en el archivo, así que
 *     la compra quedó a nombre de GENERICO y el proveedor real sin ninguna
 *     factura. Se reasigna la compra y su cuenta por pagar.
 *
 *  2. La factura 001-001-0000001 de GENERICO tiene total 0: es una fila de
 *     relleno del sistema viejo, no una compra. Se borra junto con su detalle
 *     y su cuenta por pagar (ambos también en 0).
 *
 * El script ya corregido no vuelve a producir ninguno de los dos casos, pero
 * tampoco los arregla: la factura 0033972 ya existe y la reejecución la saltea.
 *
 * Idempotente: si ya está corregido, no hace nada.
 *
 * Uso:
 *   npx ts-node --transpile-only -r tsconfig-paths/register \
 *     --project tsconfig.scripts.json \
 *     scripts/migrate-access/fix-facturas-proveedor-taller.ts \
 *     --empresa=<uuid> [--apply]
 *
 * Sin --apply → dry-run (default seguro).
 */
import 'dotenv/config';
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

const APPLY = process.argv.includes('--apply');
const empresaArg = process.argv.find((a) => a.startsWith('--empresa='))?.split('=')[1];
if (!empresaArg) {
  console.error('✗ Falta --empresa=<uuid>');
  process.exit(1);
}
const EMPRESA_ID = empresaArg;

const TIMBRADO = '2026';
const FACTURA_MAL_ATRIBUIDA = '0033972';
const FACTURA_TOTAL_CERO = '0000001';
const RUC_COMODIN = '800';
const RUC_REAL = '80068721';

async function main() {
  console.log(`\n${APPLY ? 'APLICANDO' : 'DRY-RUN'} — empresa ${EMPRESA_ID}\n`);

  // ── 1. Reasignar la factura al proveedor real ───────────────────
  const proveedorReal = await prisma.proveedores.findFirst({
    where: { empresa_id: EMPRESA_ID, personas: { ruc: RUC_REAL } },
    select: { id: true, personas: { select: { razon_social: true } } },
  });
  if (!proveedorReal) {
    console.error(`✗ No se encontró el proveedor con RUC ${RUC_REAL} en la empresa. Abortado.`);
    await prisma.$disconnect();
    process.exit(1);
  }

  const compraMal = await prisma.compra_cab.findFirst({
    where: {
      empresa_id: EMPRESA_ID,
      numero_factura: FACTURA_MAL_ATRIBUIDA,
      timbrado_proveedor: TIMBRADO,
      proveedores: { personas: { ruc: RUC_COMODIN } },
    },
    select: { id: true, total: true },
  });

  if (!compraMal) {
    console.log('~ La factura 002-002-0033972 ya está a nombre del proveedor correcto (o no existe).');
  } else {
    console.log(
      `→ Reasignar compra ${compraMal.id} (Gs. ${Number(compraMal.total).toLocaleString('es-PY')}) ` +
        `de GENERICO a "${proveedorReal.personas?.razon_social}"`,
    );
    if (APPLY) {
      await prisma.$transaction([
        prisma.compra_cab.update({
          where: { id: compraMal.id },
          data: { proveedor_id: proveedorReal.id },
        }),
        // La CxP tiene su propio proveedor_id: sin esto el estado de cuenta
        // del proveedor seguiría mostrando el movimiento en GENERICO.
        prisma.cuentas_pagar.updateMany({
          where: { compra_id: compraMal.id },
          data: { proveedor_id: proveedorReal.id },
        }),
      ]);
      console.log('  ✓ reasignada (compra + cuenta por pagar)');
    }
  }

  // ── 2. Borrar la factura en 0 ───────────────────────────────────
  const compraCero = await prisma.compra_cab.findFirst({
    where: {
      empresa_id: EMPRESA_ID,
      numero_factura: FACTURA_TOTAL_CERO,
      timbrado_proveedor: TIMBRADO,
      total: 0,
    },
    select: { id: true },
  });

  if (!compraCero) {
    console.log('~ La factura en 0 ya no existe.');
  } else {
    console.log(`→ Borrar compra ${compraCero.id} (total 0) con su detalle y su cuenta por pagar`);
    if (APPLY) {
      // cuentas_pagar no cascadea (onDelete: NoAction), así que va primero.
      // compra_det sí cascadea, pero se borra explícito para no depender de eso.
      await prisma.$transaction([
        prisma.cuentas_pagar.deleteMany({ where: { compra_id: compraCero.id } }),
        prisma.compra_det.deleteMany({ where: { compra_id: compraCero.id } }),
        prisma.compra_cab.delete({ where: { id: compraCero.id } }),
      ]);
      console.log('  ✓ borrada');
    }
  }

  // ── 3. Estado final ─────────────────────────────────────────────
  if (APPLY) {
    const comodin = await prisma.proveedores.findFirst({
      where: { empresa_id: EMPRESA_ID, personas: { ruc: RUC_COMODIN } },
      select: { id: true, _count: { select: { compra_cab: true } } },
    });
    if (comodin) {
      console.log(`\nProveedor GENERICO: ${comodin._count.compra_cab} factura(s) restantes.`);
      if (comodin._count.compra_cab === 0) {
        console.log('  (queda sin facturas; podés desactivarlo desde la pantalla de proveedores)');
      }
    }
  }

  console.log(APPLY ? '\n✓ Listo.\n' : '\nDRY-RUN — no se escribió nada. Corré con --apply.\n');
  await prisma.$disconnect();
}

main().catch(async (e) => {
  console.error('Falló:', e.message);
  await prisma.$disconnect();
  process.exit(1);
});
