// app/api/staff/cotisations/bulk-update/route.ts
import { NextResponse, NextRequest } from "next/server";
import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { cookies } from "next/headers";

export const dynamic = "force-dynamic";
export const revalidate = 0;
export const runtime = "nodejs";

// Fonction helper pour vérifier si l'utilisateur est staff
async function isStaffUser(supabase: any, userId: string): Promise<boolean> {
  try {
    const { data: staffRow } = await supabase
      .from("staff_users")
      .select("is_staff")
      .eq("user_id", userId)
      .maybeSingle();
    return !!staffRow?.is_staff;
  } catch {
    return false;
  }
}

/**
 * PATCH - Mettre à jour toutes les cotisations d'une période (org_id + period_label)
 * Body: { org_id, old_period_label, updates: { period_label?, due_date?, status? } }
 */
export async function PATCH(req: NextRequest) {
  try {
    const supabase = createRouteHandlerClient({ cookies });
    const { data: { session } } = await supabase.auth.getSession();
    
    if (!session) {
      return NextResponse.json({ error: "unauthorized" }, { status: 401 });
    }

    // Vérifier que l'utilisateur est staff
    const isStaff = await isStaffUser(supabase, session.user.id);
    if (!isStaff) {
      return NextResponse.json(
        { error: "forbidden", message: "Staff access required" },
        { status: 403 }
      );
    }

    const body = await req.json();
    const { org_id, old_period_label, updates } = body;

    if (!org_id || !old_period_label || !updates) {
      return NextResponse.json(
        { error: "Paramètres manquants: org_id, old_period_label, updates requis" },
        { status: 400 }
      );
    }

    // Construire l'objet de mise à jour
    const updateData: any = {};
    const allowedFields = ['period_label', 'due_date', 'status'];
    
    for (const field of allowedFields) {
      if (updates[field] !== undefined) {
        updateData[field] = updates[field];
      }
    }

    if (Object.keys(updateData).length === 0) {
      return NextResponse.json(
        { error: "Aucune mise à jour fournie" },
        { status: 400 }
      );
    }

    // Mettre à jour toutes les cotisations de cette période
    const { data, error } = await supabase
      .from("monthly_contributions")
      .update(updateData)
      .eq("org_id", org_id)
      .eq("period_label", old_period_label)
      .select();

    if (error) {
      console.error("[api/staff/cotisations/bulk-update] Update error:", error.message);
      return NextResponse.json(
        { error: "Erreur lors de la mise à jour", detail: error.message },
        { status: 500 }
      );
    }

    return NextResponse.json({ 
      success: true, 
      updated: data?.length || 0,
      cotisations: data 
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : String(error);
    console.error("[api/staff/cotisations/bulk-update] Error:", message);
    return NextResponse.json(
      { error: "internal_server_error", message },
      { status: 500 }
    );
  }
}
