
import { useState } from "react";
import { toast } from "sonner";
import { useAuth } from "@/contexts/AuthContext";
import { useTrips } from "@/contexts/TripContext";
import { useNavigate } from "react-router-dom";
import { Trip } from "@/types";
import { TripFormData } from "@/components/forms/schemas/tripFormSchema";
import { uploadTripCoverImage } from "./useTripImageUpload";
import { processTravelerInfo } from "./useTripTravelerSubmit";
import { supabase } from "@/integrations/supabase/client";
import { assertTripCanUseDates } from "@/services/itineraryGuards";

interface UseTripSubmitCoreProps {
  initialTrip?: Trip;
  onSuccess?: (tripId: string) => void;
}

export function useTripSubmitCore({ initialTrip, onSuccess }: UseTripSubmitCoreProps = {}) {
  const { createTrip, updateTrip, refetchTrips } = useTrips();
  const { currentUser } = useAuth();
  const navigate = useNavigate();
  const [isSubmitting, setIsSubmitting] = useState(false);

  const isEditMode = !!initialTrip;

  async function submitTripData(values: TripFormData) {
    if (!currentUser) {
      toast.error("Vous devez être connecté pour créer ou modifier un voyage");
      return null;
    }

    try {
      if (isEditMode && initialTrip) {
        assertTripCanUseDates(initialTrip.steps, values.startDate, values.endDate);
      }
      // Upload de l'image de couverture si fournie
      const coverUrl = await uploadTripCoverImage(values.coverImage) || values.coverUrl || null;

      // Traitement des données du voyageur
      const { travelerId, travelerEmail, travelerName } =
        await processTravelerInfo(values);

      // Création ou mise à jour du voyage
      let trip: Trip | null = null;

      if (isEditMode && values.id) {
        console.log("Mode édition - Mise à jour du voyage:", values.id);

        const tripUpdateData: Partial<Trip> = {
          title: values.title,
          destination: values.destination,
          startDate: values.startDate,
          endDate: values.endDate,
          coverUrl,
          bannerUrl: coverUrl, // Utiliser la même URL que coverUrl
        };

        // N'ajouter les données du voyageur que si elles existent
        if (travelerEmail) tripUpdateData.travelerEmail = travelerEmail;
        if (travelerName) tripUpdateData.travelerName = travelerName;

        trip = await updateTrip(values.id, tripUpdateData);

      } else {
        console.log("Mode création - Nouveau voyage");
        trip = await createTrip({
          title: values.title,
          destination: values.destination,
          startDate: values.startDate,
          endDate: values.endDate,
          travelerEmail,
          travelerName,
          plannerId: currentUser.id,
          travelerId,
          coverUrl,
          bannerUrl: coverUrl,
        });

      }

      let invitationFailed = false;
      if (trip && travelerId) {
        const { error } = await supabase.rpc("assign_existing_traveler", {
          p_trip_id: trip.id,
          p_traveler_id: travelerId,
        });
        if (error) throw new Error("Ce voyageur ne peut pas être associé à ce voyage.");
        trip = { ...trip, travelerId, travelerEmail, travelerName };
      } else if (trip && travelerEmail && (!initialTrip?.travelerId || initialTrip.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. Vous pourrez la renvoyer.");
        }
      }

      if (trip && !invitationFailed) {
        const invitationSent = travelerEmail && !travelerId && (!initialTrip?.travelerId || initialTrip.travelerEmail !== travelerEmail);
        toast.success(
          isEditMode
            ? "Voyage mis à jour avec succès !"
            : invitationSent
              ? "Voyage créé et invitation envoyée !"
              : "Voyage créé avec succès !"
        );
      }

      if (trip) refetchTrips();

      return trip;
    } catch (error) {
      console.error("Erreur lors de la création/modification du voyage:", error);
      throw error;
    }
  }

  return {
    submitTripData,
    isEditMode
  };
}
