import { NextRequest, NextResponse } from "next/server";
import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { cookies } from "next/headers";
import { S3Client, DeleteObjectCommand } from "@aws-sdk/client-s3";

export const dynamic = "force-dynamic";

export async function PATCH(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    const supabase = createRouteHandlerClient({ cookies });
    
    // Vérifier l'authentification
    const { data: { user }, error: authError } = await supabase.auth.getUser();
    if (authError || !user) {
      return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
    }

    // Vérifier que l'utilisateur est staff
    const { data: staffUser } = await supabase
      .from("staff_users")
      .select("is_staff")
      .eq("user_id", user.id)
      .maybeSingle();

    if (!staffUser?.is_staff) {
      return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
    }

    // Récupérer l'avenant
    const { data: avenant, error: fetchError } = await supabase
      .from("avenants")
      .select("id, statut")
      .eq("id", id)
      .single();

    if (fetchError || !avenant) {
      return NextResponse.json({ error: "Avenant non trouvé" }, { status: 404 });
    }

    // Vérifier que l'avenant est en brouillon
    if (avenant.statut !== "draft") {
      return NextResponse.json(
        { error: "Seuls les avenants en brouillon peuvent être modifiés" },
        { status: 400 }
      );
    }

    // Récupérer les données de la requête
    const body = await request.json();
    const {
      date_effet,
      date_avenant,
      type_avenant,
      motif_avenant,
      elements_avenantes,
      objet_data,
      duree_data,
      lieu_horaire_data,
      remuneration_data,
      pdf_s3_key,
    } = body;

    // Mettre à jour l'avenant
    const { data: updatedAvenant, error: updateError } = await supabase
      .from("avenants")
      .update({
        date_effet,
        date_avenant,
        type_avenant,
        motif_avenant,
        elements_avenantes,
        objet_data,
        duree_data,
        lieu_horaire_data,
        remuneration_data,
        pdf_s3_key,
      })
      .eq("id", id)
      .select()
      .single();

    if (updateError) {
      console.error("Erreur mise à jour avenant:", updateError);
      return NextResponse.json(
        { error: "Erreur lors de la mise à jour de l'avenant" },
        { status: 500 }
      );
    }

    return NextResponse.json({
      success: true,
      avenant: updatedAvenant,
      message: "Avenant modifié avec succès",
    });
  } catch (error) {
    console.error("Erreur API patch amendment:", error);
    return NextResponse.json(
      { error: "Erreur serveur" },
      { status: 500 }
    );
  }
}

export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    const supabase = createRouteHandlerClient({ cookies });
    
    // Vérifier l'authentification
    const { data: { user }, error: authError } = await supabase.auth.getUser();
    if (authError || !user) {
      return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
    }

    // Vérifier que l'utilisateur est staff
    const { data: staffUser } = await supabase
      .from("staff_users")
      .select("is_staff")
      .eq("user_id", user.id)
      .maybeSingle();

    if (!staffUser?.is_staff) {
      return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
    }

    // Récupérer l'avenant pour obtenir la clé S3
    const { data: avenant, error: fetchError } = await supabase
      .from("avenants")
      .select("id, numero_avenant, pdf_s3_key")
      .eq("id", id)
      .single();

    if (fetchError || !avenant) {
      return NextResponse.json({ error: "Avenant non trouvé" }, { status: 404 });
    }

    // Supprimer le PDF de S3 s'il existe
    if (avenant.pdf_s3_key) {
      try {
        const s3Client = new S3Client({
          region: process.env.AWS_REGION || "eu-west-3",
          credentials: {
            accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
            secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
          },
        });

        await s3Client.send(
          new DeleteObjectCommand({
            Bucket: "odentas-docs",
            Key: avenant.pdf_s3_key,
          })
        );

        console.log(`PDF supprimé de S3: ${avenant.pdf_s3_key}`);
      } catch (s3Error) {
        console.error("Erreur suppression S3:", s3Error);
        // On continue quand même la suppression en BDD
      }
    }

    // Supprimer l'avenant de la base de données
    const { error: deleteError } = await supabase
      .from("avenants")
      .delete()
      .eq("id", id);

    if (deleteError) {
      console.error("Erreur suppression avenant:", deleteError);
      return NextResponse.json(
        { error: "Erreur lors de la suppression de l'avenant" },
        { status: 500 }
      );
    }

    return NextResponse.json({
      success: true,
      message: `Avenant ${avenant.numero_avenant} supprimé avec succès`,
    });
  } catch (error) {
    console.error("Erreur API delete amendment:", error);
    return NextResponse.json(
      { error: "Erreur serveur" },
      { status: 500 }
    );
  }
}
