import { NextRequest, NextResponse } from "next/server";
import { createSbServiceRole } from "@/lib/supabaseServer";
import { sendUniversalEmailV2, EmailDataV2 } from "@/lib/emailTemplateService";
import { checkAndMarkWebhookProcessed } from "@/lib/webhookDeduplication";

export const dynamic = "force-dynamic";

/**
 * Webhook pour gérer les signatures d'avenants via DocuSeal
 * Appelé après que l'employeur a signé un avenant
 * 
 * Flux :
 * 1. Employeur signe via DocuSeal
 * 2. DocuSeal → Lambda postDocuSealAvenantSalarie → Cette route API
 * 3. Cette route :
 *    - Met à jour le statut de l'avenant dans Supabase
 *    - Envoie l'email au salarié via le système universel v2
 *    - Retourne les infos pour logging
 */
export async function POST(request: NextRequest) {
  console.log("🔔 [WEBHOOK AVENANT] Début du traitement");

  try {
    const body = await request.json();
    console.log("📦 [WEBHOOK AVENANT] Body reçu:", JSON.stringify(body, null, 2));

    const {
      documentName, // Numéro de l'avenant (ex: AVE-001)
      employeeSlug, // Slug DocuSeal du salarié
      submissionId, // ID de la soumission DocuSeal
      employeeEmail, // Email du salarié
      // Données pour l'email
      reference, // Référence du contrat
      salarie, // Nom complet du salarié
      date, // Date de début
      poste, // Poste/profession
      analytique, // Production
      structure, // Nom de l'organisation
      prenom_salarie,
      prenom_signataire,
      code_employeur,
      matricule,
    } = body;

    // Validation des champs requis
    if (!documentName || !employeeSlug || !employeeEmail || !submissionId) {
      console.error("❌ [WEBHOOK AVENANT] Champs manquants:", {
        documentName: !!documentName,
        employeeSlug: !!employeeSlug,
        employeeEmail: !!employeeEmail,
        submissionId: !!submissionId,
      });
      return NextResponse.json(
        { error: "Champs manquants" },
        { status: 400 }
      );
    }

    // 🔒 DÉDUPLICATION : Vérifier si ce webhook a déjà été traité
    const isNew = await checkAndMarkWebhookProcessed(
      submissionId,
      "avenant_employer_signed",
      undefined,
      body
    );

    if (!isNew) {
      console.log("⚠️ [WEBHOOK AVENANT] Webhook déjà traité, ignoré pour éviter doublon");
      return NextResponse.json(
        { message: "Webhook déjà traité" },
        { status: 200 }
      );
    }

    console.log("✅ [WEBHOOK AVENANT] Nouveau webhook, traitement...");

    const supabase = createSbServiceRole();

    // 1. Trouver l'avenant par son submission ID DocuSeal (identifiant unique)
    console.log("🔍 [WEBHOOK AVENANT] Recherche de l'avenant par submissionId:", submissionId);
    const { data: avenant, error: avenantError } = await supabase
      .from("avenants")
      .select(`
        *,
        cddu_contracts (
          *,
          salaries (
            prenom,
            nom,
            adresse_mail
          ),
          organizations (
            id,
            name
          )
        )
      `)
      .eq("docuseal_submission_id", submissionId)
      .maybeSingle();

    if (avenantError || !avenant) {
      console.error("❌ [WEBHOOK AVENANT] Avenant non trouvé:", avenantError);
      return NextResponse.json(
        { error: "Avenant non trouvé", details: avenantError?.message },
        { status: 404 }
      );
    }

    console.log("✅ [WEBHOOK AVENANT] Avenant trouvé:", {
      id: avenant.id,
      numero: avenant.numero_avenant,
      statut_actuel: avenant.signature_status,
    });

    // IMPORTANT: Vérifier que l'avenant n'est pas déjà en attente salarié ou signé
    // Si c'est le cas, c'est que ce webhook est appelé lors de la signature du salarié
    // et on ne doit PAS renvoyer l'email d'invitation au salarié
    if (avenant.signature_status === 'pending_employee' || avenant.signature_status === 'signed') {
      console.log("⏸️ [WEBHOOK AVENANT] Avenant déjà en attente salarié ou signé - webhook ignoré");
      console.log("ℹ️ [WEBHOOK AVENANT] Ce webhook a probablement été appelé lors de la signature du salarié");
      return NextResponse.json({ 
        message: "Webhook ignoré - avenant déjà traité",
        current_status: avenant.signature_status 
      }, { status: 200 });
    }

    // 2. Mettre à jour le statut de l'avenant
    console.log("🔄 [WEBHOOK AVENANT] Mise à jour du statut...");
    const { error: updateError } = await supabase
      .from("avenants")
      .update({
        signature_status: "pending_employee", // Employeur signé, en attente salarié
        employee_docuseal_slug: employeeSlug, // Stocker le slug pour la page signature
        last_employee_notification_at: new Date().toISOString(),
      })
      .eq("id", avenant.id);

    if (updateError) {
      console.error("❌ [WEBHOOK AVENANT] Erreur mise à jour:", updateError);
      // On continue quand même pour envoyer l'email
    } else {
      console.log("✅ [WEBHOOK AVENANT] Statut mis à jour: pending_employee");
    }

    // 3. Préparer les données pour l'email
    const signatureLink = `https://paie.odentas.fr/signature-salarie/?docuseal_id=${employeeSlug}`;
    
    // Formater la date de manière sécurisée
    const formatDate = (dateStr?: string) => {
      if (!dateStr || dateStr === 'undefined' || dateStr === 'null') return "-";
      try {
        // Si la date est déjà au format JJ/MM/AAAA
        if (dateStr.includes('/')) return dateStr;
        // Si la date est au format AAAA-MM-JJ
        const parts = dateStr.split("-");
        if (parts.length === 3) {
          const [y, m, d] = parts;
          return `${d}/${m}/${y}`;
        }
        return dateStr;
      } catch (e) {
        return "-";
      }
    };

    const salarie_data = avenant.cddu_contracts?.salaries;
    const contract_data = avenant.cddu_contracts;
    const organization_data = contract_data?.organizations;

    console.log("📧 [WEBHOOK AVENANT] Données brutes pour email:", {
      date_from_payload: date,
      start_date_from_contract: contract_data?.start_date,
      poste_from_payload: poste,
      fonction_from_contract: contract_data?.fonction,
    });

    // Utiliser les données de l'avenant/contrat en priorité sur celles de la Lambda
    const dateDebut = (date && date !== "Non spécifié" && date !== "undefined" && date !== "null") 
      ? date 
      : contract_data?.start_date;
    const posteValue = (poste && poste !== "Non spécifié" && poste !== "undefined" && poste !== "null")
      ? poste
      : contract_data?.fonction;
    const analytiqueValue = (analytique && analytique !== "Non spécifié" && analytique !== "undefined" && analytique !== "null")
      ? analytique
      : contract_data?.analytique;

    const emailData: EmailDataV2 = {
      firstName: prenom_salarie || salarie_data?.prenom || "Salarié",
      organizationName: structure || organization_data?.name || "Votre employeur",
      employerCode: code_employeur || "Non spécifié",
      matricule: matricule || "Non spécifié",
      contractReference: reference || contract_data?.contract_number || "Non spécifié",
      startDate: formatDate(dateDebut),
      profession: posteValue || "Non spécifié",
      productionName: analytiqueValue || "Non spécifié",
      ctaUrl: signatureLink,
      numeroAvenant: avenant.numero_avenant,
      contractType: "CDDU (contrat intermittent)",
    };

    // 4. Envoyer l'email au salarié via le système universel v2
    console.log("📧 [WEBHOOK AVENANT] Envoi de l'email au salarié...");
    console.log("📧 [WEBHOOK AVENANT] Email data:", emailData);

    try {
      const messageId = await sendUniversalEmailV2({
        type: "signature-request-employee-amendment",
        toEmail: employeeEmail,
        data: emailData,
      });

      console.log("✅ [WEBHOOK AVENANT] Email envoyé avec succès:", messageId);

      return NextResponse.json({
        success: true,
        message: "Email de signature envoyé au salarié",
        messageId,
        avenantId: avenant.id,
        signatureLink,
      });
    } catch (emailError: any) {
      console.error("❌ [WEBHOOK AVENANT] Erreur envoi email:", emailError);
      return NextResponse.json(
        {
          error: "Erreur lors de l'envoi de l'email",
          details: emailError.message,
          avenantId: avenant.id,
        },
        { status: 500 }
      );
    }
  } catch (error: any) {
    console.error("❌❌❌ [WEBHOOK AVENANT] ERREUR FATALE:", error);
    console.error("Stack trace:", error.stack);
    return NextResponse.json(
      { error: "Erreur serveur", details: error.message },
      { status: 500 }
    );
  }
}
