import { NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';

const parseSafeFloat = (val: unknown) => {
  if (val === null || val === undefined || val === '') return null;
  const parsed = parseFloat(String(val).replace(/[%$]/g, '').trim());
  return isNaN(parsed) ? null : parsed;
};

export async function POST(request: Request) {
  try {
    const body = await request.json();
    const { items } = body;

    if (!items || !Array.isArray(items) || items.length === 0) {
      return NextResponse.json({ error: 'No se enviaron datos para importar.' }, { status: 400 });
    }

    let inserted = 0;
    let updated = 0;
    const errors: string[] = [];

    for (const raw of items) {
      // Find matching keys regardless of exact casing or column names
      const findVal = (keys: string[]) => {
        for (const k of keys) {
          for (const rawKey of Object.keys(raw)) {
            if (rawKey.trim().toLowerCase() === k.trim().toLowerCase()) {
              return raw[rawKey];
            }
          }
        }
        return undefined;
      };

      const name = findVal(['nombre', 'nombre del producto', 'name', 'product', 'producto', 'lista de productos']);
      const htsCode = findVal(['hts', 'hts code', 'hts code (usa)', 'us hts', 'us hts code', 'htscode']);
      const nandina = findVal(['nandina', 'nandina (ecuador)', 'codigo nandina', 'nandinacode']);
      const dutyRateEC = findVal(['duty ec', 'duty ec (%)', 'dutyec', 'arancel ec', 'arancel ecuador']);
      const dutyRateCO = findVal(['duty co', 'duty co (%)', 'dutyco', 'arancel co', 'arancel colombia']);
      const dutyRateUS = findVal(['duty us', 'duty us (%)', 'dutyus', 'duty usa (%)', 'arancel us']);
      const declaredValue = findVal(['costo declarado por tallo ($)', 'costo decl/stem', 'costo declarado', 'declared value', 'declaredvalue', 'dclvalue']);
      const description = findVal(['descripcion', 'descripcion aduana', 'descripción', 'description']);

      if (!name || !htsCode || !nandina) {
        errors.push(`Fila omitida por faltar Nombre, HTS o Nandina: ${JSON.stringify(raw)}`);
        continue;
      }

      const formattedName = String(name).toUpperCase().trim();
      const formattedHts = String(htsCode).trim();
      const formattedNandina = String(nandina).trim();

      const existing = await prisma.htsProduct.findUnique({
        where: { name: formattedName }
      });

      if (existing) {
        await prisma.htsProduct.update({
          where: { name: formattedName },
          data: {
            htsCode: formattedHts,
            nandina: formattedNandina,
            dutyRateEC: parseSafeFloat(dutyRateEC),
            dutyRateCO: parseSafeFloat(dutyRateCO),
            dutyRateUS: parseSafeFloat(dutyRateUS),
            declaredValue: parseSafeFloat(declaredValue),
            description: description ? String(description).trim() : existing.description
          }
        });
        updated++;
      } else {
        await prisma.htsProduct.create({
          data: {
            name: formattedName,
            htsCode: formattedHts,
            nandina: formattedNandina,
            dutyRateEC: parseSafeFloat(dutyRateEC),
            dutyRateCO: parseSafeFloat(dutyRateCO),
            dutyRateUS: parseSafeFloat(dutyRateUS),
            declaredValue: parseSafeFloat(declaredValue),
            description: description ? String(description).trim() : null
          }
        });
        inserted++;
      }
    }

    return NextResponse.json({
      success: true,
      inserted,
      updated,
      total: inserted + updated,
      errors: errors.slice(0, 10)
    });
  } catch (error: any) {
    return NextResponse.json({ error: error.message || 'Error importando catálogo HTS' }, { status: 500 });
  }
}
