import { NextRequest, NextResponse } from 'next/server';
import { getSupabaseAdmin } from '@/lib/supabase';

// GET: list reference prices
export async function GET(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const supplier = searchParams.get('supplier');
    const category = searchParams.get('category');
    const search = searchParams.get('search');
    const includeExpired = searchParams.get('includeExpired') === 'true';

    const supabase = getSupabaseAdmin();

    let query = supabase.from('reference_prices').select('*');

    if (!includeExpired) {
      query = query.is('valid_to', null);
    }
    if (supplier) query = query.eq('supplier', supplier);
    if (category) query = query.eq('category', category);
    if (search) query = query.ilike('product_name', `%${search}%`);
    const source = searchParams.get('source');
    if (source === 'manual') query = query.eq('is_manual', true);
    else if (source === 'catalog') query = query.or('is_manual.is.null,is_manual.eq.false');

    query = query.order('supplier').order('product_name');

    const { data, error } = await query;
    if (error) return NextResponse.json({ error: error.message }, { status: 500 });

    return NextResponse.json(data);
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}

// POST: add a new reference price
export async function POST(req: NextRequest) {
  try {
    const body = await req.json();
    const { supplier, product_name, category, gamme, classe, price_ht } = body;

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

    const supabase = getSupabaseAdmin();

    const { data, error } = await supabase
      .from('reference_prices')
      .insert({
        supplier,
        product_name,
        category: category || 'RIC',
        gamme: gamme || null,
        classe: classe || null,
        price_ht,
        valid_from: new Date().toISOString().split('T')[0],
        valid_to: null,
      })
      .select()
      .single();

    if (error) return NextResponse.json({ error: error.message }, { status: 500 });

    return NextResponse.json(data);
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}

// PUT: update a reference price (with versioning)
export async function PUT(req: NextRequest) {
  try {
    const body = await req.json();
    const { id, price_ht, product_name, category, gamme, classe } = body;

    if (!id) {
      return NextResponse.json({ error: 'id requis' }, { status: 400 });
    }

    const supabase = getSupabaseAdmin();

    // If price changed, version it
    if (price_ht !== undefined) {
      const { data: existing } = await supabase
        .from('reference_prices')
        .select('*')
        .eq('id', id)
        .single();

      if (existing && existing.price_ht !== price_ht) {
        // Close existing price validity
        await supabase
          .from('reference_prices')
          .update({ valid_to: new Date().toISOString().split('T')[0] })
          .eq('id', id);

        // Create new version
        const { data: newPrice, error } = await supabase
          .from('reference_prices')
          .insert({
            supplier: existing.supplier,
            product_name: product_name || existing.product_name,
            category: category || existing.category,
            gamme: gamme !== undefined ? gamme : existing.gamme,
            classe: classe !== undefined ? classe : existing.classe,
            price_ht,
            valid_from: new Date().toISOString().split('T')[0],
            valid_to: null,
          })
          .select()
          .single();

        if (error) return NextResponse.json({ error: error.message }, { status: 500 });
        return NextResponse.json(newPrice);
      }
    }

    // Non-price update
    const updates: Record<string, unknown> = {};
    if (product_name !== undefined) updates.product_name = product_name;
    if (category !== undefined) updates.category = category;
    if (gamme !== undefined) updates.gamme = gamme;
    if (classe !== undefined) updates.classe = classe;

    const { data, error } = await supabase
      .from('reference_prices')
      .update(updates)
      .eq('id', id)
      .select()
      .single();

    if (error) return NextResponse.json({ error: error.message }, { status: 500 });

    return NextResponse.json(data);
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}

// DELETE
export async function DELETE(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const id = searchParams.get('id');
    if (!id) return NextResponse.json({ error: 'id requis' }, { status: 400 });

    const supabase = getSupabaseAdmin();
    const { error } = await supabase.from('reference_prices').delete().eq('id', id);
    if (error) return NextResponse.json({ error: error.message }, { status: 500 });

    return NextResponse.json({ success: true });
  } catch (error) {
    const message = error instanceof Error ? error.message : 'Erreur inconnue';
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
