import { NextRequest, NextResponse } from 'next/server';
import { parseSigniaEDI } from '@/lib/parsers/signia';
import { parseResoundEDI } from '@/lib/parsers/resound';
import { parseStarkeyEDI } from '@/lib/parsers/starkey';
import { extractPDFLines } from '@/lib/pdf-extractor';
import { Supplier } from '@/types';

// Allow up to 5 minutes for large file processing
export const maxDuration = 300;

export async function POST(req: NextRequest) {
  try {
    const formData = await req.formData();
    const file = formData.get('file') as File | null;
    const supplier = formData.get('supplier') as Supplier | null;
    const fileType = formData.get('fileType') as 'edi' | 'pdf' | null;

    if (!file || !supplier) {
      return NextResponse.json(
        { error: 'Fichier et fournisseur requis' },
        { status: 400 }
      );
    }

    if (fileType === 'pdf') {
      const arrayBuffer = await file.arrayBuffer();
      const base64 = Buffer.from(arrayBuffer).toString('base64');
      const lines = await extractPDFLines(base64, supplier);
      return NextResponse.json({
        supplier,
        source: 'pdf',
        filename: file.name,
        lineCount: lines.length,
        lines,
      });
    }

    // EDI parsing
    if (supplier === 'starkey') {
      const arrayBuffer = await file.arrayBuffer();
      const decoder = new TextDecoder('latin1');
      const csvText = decoder.decode(arrayBuffer);
      const lines = parseStarkeyEDI(csvText);
      return NextResponse.json({
        supplier,
        source: 'edi',
        filename: file.name,
        lineCount: lines.length,
        lines,
      });
    }

    // Signia or ReSound (xlsx)
    const arrayBuffer = await file.arrayBuffer();
    const lines =
      supplier === 'signia'
        ? parseSigniaEDI(arrayBuffer)
        : parseResoundEDI(arrayBuffer);

    return NextResponse.json({
      supplier,
      source: 'edi',
      filename: file.name,
      lineCount: lines.length,
      lines,
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
