import { NextRequest, NextResponse } from 'next/server';
import { getSupabaseAdmin } from '@/lib/supabase';
import * as XLSX from 'xlsx';
import { SUPPLIERS } from '@/config/suppliers';

export async function GET(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const analysisId = searchParams.get('analysis_id');
    const month = searchParams.get('month');

    if (!analysisId && !month) {
      return NextResponse.json(
        { error: 'analysis_id ou month requis' },
        { status: 400 }
      );
    }

    const supabase = getSupabaseAdmin();

    let analyses;
    if (analysisId) {
      const { data } = await supabase
        .from('analyses')
        .select('*')
        .eq('id', analysisId);
      analyses = data;
    } else {
      const { data } = await supabase
        .from('analyses')
        .select('*')
        .eq('month', month!);
      analyses = data;
    }

    if (!analyses?.length) {
      return NextResponse.json({ error: 'Aucune analyse trouvée' }, { status: 404 });
    }

    // Fetch all lines
    const allLines = [];
    for (const analysis of analyses) {
      const { data: lines } = await supabase
        .from('analysis_lines')
        .select('*')
        .eq('analysis_id', analysis.id)
        .order('discrepancy', { ascending: false });

      for (const line of lines ?? []) {
        allLines.push({
          Fournisseur: SUPPLIERS[analysis.supplier as keyof typeof SUPPLIERS]?.label ?? analysis.supplier,
          Centre: line.centre ?? '',
          'Code Article': line.code_article,
          Description: line.description,
          Quantité: line.quantity,
          'Prix Facturé (€)': line.invoiced_price,
          'Prix Négocié (€)': line.negotiated_price ?? '',
          'Écart (€)': line.discrepancy > 0 ? line.discrepancy : '',
          'Produit Référence': line.matched_product ?? '',
          'N° Facture': line.invoice_number ?? '',
        });
      }
    }

    // Create workbook
    const wb = XLSX.utils.book_new();
    const ws = XLSX.utils.json_to_sheet(allLines);

    // Set column widths
    ws['!cols'] = [
      { wch: 12 }, // Fournisseur
      { wch: 25 }, // Centre
      { wch: 15 }, // Code Article
      { wch: 40 }, // Description
      { wch: 8 },  // Quantité
      { wch: 15 }, // Prix Facturé
      { wch: 15 }, // Prix Négocié
      { wch: 12 }, // Écart
      { wch: 35 }, // Produit Référence
      { wch: 15 }, // N° Facture
    ];

    XLSX.utils.book_append_sheet(wb, ws, 'Écarts');

    const buffer = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' });

    return new NextResponse(buffer, {
      headers: {
        'Content-Type':
          'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'Content-Disposition': `attachment; filename="ecarts_${month || analysisId}.xlsx"`,
      },
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
