
import { useRef, useState } from "react";
import { UseFormReturn } from "react-hook-form";
import { toast } from "sonner";
import { Trip } from "@/types";
import { TripFormData } from "@/components/forms/schemas/tripFormSchema";
import { useTrips } from "@/contexts/TripContext";
import { supabase } from "@/integrations/supabase/client";
import { assertTripCanUseDates } from "@/services/itineraryGuards";
import { shouldAssignExistingTraveler } from "@/services/tripMemberAssignment";

interface UseTripFormSubmissionProps {
  trip: Trip;
  form: UseFormReturn<TripFormData>;
  onSuccess?: () => void;
}

export function useTripFormSubmission({ trip, form, onSuccess }: UseTripFormSubmissionProps) {
  const { updateTrip, refetchTrips } = useTrips();
  const [isSubmitting, setIsSubmitting] = useState(false);
  const submittingRef = useRef(false);

  const handleSubmit = async (data: TripFormData) => {
    if (submittingRef.current) return;
    submittingRef.current = true;
    try {
      setIsSubmitting(true);
      console.group("🧳 Mise à jour du voyage");
      console.log("ID du voyage:", trip.id);
      console.log("Données soumises:", data);
      assertTripCanUseDates(trip.steps, data.startDate, data.endDate);

      // Préparer les données du voyageur selon le type sélectionné
      let travelerEmail = null;
      let travelerName = null;
      let travelerId = "";

      if (data.travelerType === "existing" && data.existingTraveler) {
        console.log("Utilisation d'un voyageur existant:", data.existingTraveler);
        travelerEmail = data.existingTraveler.email;
        travelerName = data.existingTraveler.name;
        travelerId = data.existingTraveler.id;
      } else if (data.travelerType === "new" && data.newTraveler) {
        console.log("Création d'un nouveau voyageur:", data.newTraveler);
        travelerEmail = data.newTraveler.email;
        travelerName = data.newTraveler.name;
      }

      const updatedData = {
        title: data.title,
        destination: data.destination,
        startDate: data.startDate,
        endDate: data.endDate,
        coverUrl: data.coverUrl,
      };

      console.log("Données finales pour la mise à jour:", updatedData);

      const updatedTrip = await updateTrip(trip.id, updatedData);

      if (updatedTrip) {
        let invitationFailed = false;
        if (shouldAssignExistingTraveler(travelerId, trip.members)) {
          const { error } = await supabase.rpc("assign_existing_traveler", {
            p_trip_id: trip.id,
            p_traveler_id: travelerId,
          });
          if (error) {
            console.error("Association du voyageur refusée", {
              tripId: trip.id,
              travelerId,
              code: error.code,
              message: error.message,
              details: error.details,
              hint: error.hint,
            });
            throw error;
          }
        } else if (travelerEmail && !trip.travelerId && trip.travelerEmail !== travelerEmail) {
          const { error } = await supabase.functions.invoke("invite-user", {
            body: { tripId: trip.id, email: travelerEmail, travelerName },
          });
          if (error) {
            invitationFailed = true;
            toast.warning("Le voyage a été enregistré, mais l'invitation n'a pas pu être envoyée.");
          }
        }
        console.log("Voyage mis à jour avec succès:", updatedTrip);
        if (!invitationFailed) {
          toast.success("Les modifications du voyage ont été enregistrées avec succès");
        }
        refetchTrips();

        // Indiquer que le voyage vient d'être modifié
        sessionStorage.setItem('justEditedTrip', 'true');

        if (onSuccess) onSuccess();
      }

      console.groupEnd();
    } catch (error) {
      console.error("Erreur lors de la mise à jour du voyage:", error);
      toast.error("Erreur lors de la mise à jour du voyage. Veuillez vérifier vos informations et réessayer.");
    } finally {
      submittingRef.current = false;
      setIsSubmitting(false);
    }
  };

  return {
    isSubmitting,
    onSubmit: form.handleSubmit(handleSubmit)
  };
}
