import { PrismaClient } from '@prisma/client';
import { readFileSync } from 'fs';
import { resolve } from 'path';

const prisma = new PrismaClient();

const SITUACIONES_VALIDAS = ['Definitivo', 'Presunto', 'Desvirtuado', 'Sentencia Favorable'];

function parseCsvLine(line: string): string[] {
  const fields: string[] = [];
  let current = '';
  let inQuotes = false;

  for (let i = 0; i < line.length; i++) {
    const c = line[i];
    if (c === '"') {
      if (inQuotes && line[i + 1] === '"') {
        current += '"';
        i++;
      } else {
        inQuotes = !inQuotes;
      }
    } else if (c === ',' && !inQuotes) {
      fields.push(current.trim());
      current = '';
    } else {
      current += c;
    }
  }
  fields.push(current.trim());
  return fields;
}

async function main() {
  const filePath = resolve(__dirname, '..', '..', '..', 'lista_negra', 'Listado_completo_69-B.csv');
  console.log('📂 Leyendo:', filePath);

  const data = readFileSync(filePath, 'latin1');
  const lines = data.split('\n');
  console.log(`📄 ${lines.length} líneas en el archivo`);

  // Parsear registros (saltar headers: líneas 0, 1, 2)
  const registros: { rfc: string; nombre: string; situacion: string }[] = [];

  for (let i = 3; i < lines.length; i++) {
    const line = lines[i].replace(/\r/g, '').trim();
    if (!line) continue;

    const fields = parseCsvLine(line);
    if (fields.length < 4) continue;

    const rfc = fields[1]?.trim();
    const nombre = fields[2]?.trim();
    const situacion = fields[3]?.trim();

    if (!rfc || !rfc.match(/^[A-Z0-9&]{10,13}$/)) continue;
    if (!SITUACIONES_VALIDAS.includes(situacion)) continue;

    registros.push({ rfc, nombre, situacion });
  }

  console.log(`✅ ${registros.length} registros válidos parseados`);

  // Contar por situación
  const counts: Record<string, number> = {};
  for (const r of registros) {
    counts[r.situacion] = (counts[r.situacion] || 0) + 1;
  }
  console.log('   Situaciones:', counts);

  // Sincronizar: limpiar y reinsertar todo
  console.log('🔄 Sincronizando con base de datos...');

  await prisma.listaNegra.deleteMany();

  // Insertar en batches de 500
  const BATCH = 500;
  let inserted = 0;

  for (let i = 0; i < registros.length; i += BATCH) {
    const batch = registros.slice(i, i + BATCH);

    // Deduplicar por RFC (quedarse con el último)
    const unique = new Map<string, typeof batch[0]>();
    for (const r of batch) unique.set(r.rfc, r);

    await prisma.listaNegra.createMany({
      data: Array.from(unique.values()),
      skipDuplicates: true,
    });

    inserted += unique.size;
    if ((i + BATCH) % 5000 === 0 || i + BATCH >= registros.length) {
      console.log(`   ${Math.min(i + BATCH, registros.length)}/${registros.length}...`);
    }
  }

  const total = await prisma.listaNegra.count();
  console.log(`\n🎉 Lista negra actualizada: ${total} registros en la base de datos`);
}

main()
  .catch(console.error)
  .finally(() => prisma.$disconnect());
