
import { useState } from "react";
import { differenceInCalendarDays, parseISO } from "date-fns";
import { Trip } from "@/types";
import { useAuth } from "@/contexts/AuthContext";
import { useTravelerSearch } from "@/hooks/useTravelerSearch";
import { useTripFormInit } from "@/hooks/useTripFormInit";
import { useTripTravelers } from "@/hooks/useTripTravelers";
import { useTripFormSubmission } from "@/hooks/useTripFormSubmission";

interface UseEditTripFormProps {
  trip: Trip;
  onSuccess?: () => void;
}

export function useEditTripForm({ trip, onSuccess }: UseEditTripFormProps) {
  const { currentUser } = useAuth();
  const [popoverOpen, setPopoverOpen] = useState(false);

  // Initialize travelers search functionality
  const {
    travelers,
    searchTerm,
    setSearchTerm,
    loading: loadingTravelers,
    error: travelersError
  } = useTravelerSearch();

  // Initialize the form with trip data
  const form = useTripFormInit({ trip });

  // Initialize traveler handling functionality
  const {
    handleSelectTraveler,
    handleNewTraveler,
    handleNoTraveler,
    isCreatingNewTraveler,
    setIsCreatingNewTraveler
  } = useTripTravelers({ form });

  // Initialize form submission functionality
  const { isSubmitting, onSubmit } = useTripFormSubmission({
    trip,
    form,
    onSuccess
  });

  // Calculate trip duration when dates change
  const startDate = form.watch("startDate");
  const endDate = form.watch("endDate");

  const tripDuration = startDate && endDate
    ? Math.max(0, differenceInCalendarDays(parseISO(endDate), parseISO(startDate)) + 1)
    : null;

  const formatTripDuration = (days: number) => {
    if (days === 1) return "1 jour";
    return `${days} jours`;
  };

  return {
    form,
    isSubmitting,
    tripDuration,
    formatTripDuration,
    travelers,
    searchTerm,
    setSearchTerm,
    loadingTravelers,
    handleSelectTraveler,
    handleNewTraveler,
    handleNoTraveler,
    onSubmit,
    popoverOpen,
    setPopoverOpen,
    isCreatingNewTraveler,
    setIsCreatingNewTraveler,
  };
}
