
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { Trip } from "@/types";
import { tripFormSchema, TripFormData } from "@/components/forms/schemas/tripFormSchema";
import { useTripDuration } from "./useTripDuration";
import { useTravelerSearch } from "./useTravelerSearch";
import { useTripFormSubmit } from "./useTripFormSubmit";
import { useTripFormHelper } from "./useTripFormHelper";
import { useFormPersistence } from "./useFormPersistence";

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

export function useTripFormLogic({ initialTrip, onSuccess }: UseTripFormLogicProps = {}) {
  const isEditMode = !!initialTrip;

  // Configuration du formulaire avec React Hook Form et Zod
  const form = useForm<TripFormData>({
    resolver: zodResolver(tripFormSchema),
    defaultValues: {
      id: initialTrip?.id,
      title: initialTrip?.title || "",
      destination: initialTrip?.destination || "",
      startDate: initialTrip?.startDate || "",
      endDate: initialTrip?.endDate || "",
      travelerType: initialTrip?.travelerId ? "existing" : initialTrip?.travelerEmail ? "new" : "none",
      existingTraveler: initialTrip?.travelerId ? {
        id: initialTrip.travelerId,
        name: initialTrip.travelerName,
        email: initialTrip.travelerEmail || "",
      } : undefined,
      newTraveler: !initialTrip?.travelerId && initialTrip?.travelerEmail ? {
        name: initialTrip?.travelerName || "",
        email: initialTrip?.travelerEmail || "",
      } : undefined,
      coverUrl: initialTrip?.coverUrl,
      bannerUrl: initialTrip?.bannerUrl,
    },
  });

  // Utiliser la persistance pour les formulaires de création uniquement
  const persistenceKey = isEditMode ? null : "trip-form-draft";
  const { clearSavedData } = useFormPersistence(form, persistenceKey);

  // Utilisation de nos hooks spécialisés
  const { tripDuration, formatTripDuration } = useTripDuration(form.watch);
  const { travelers, searchTerm, setSearchTerm } = useTravelerSearch();

  // Personnalisation de l'action d'envoi pour effacer les données sauvegardées
  const { onSubmit: originalSubmit, isSubmitting } = useTripFormSubmit({
    initialTrip,
    onSuccess: (tripId) => {
      clearSavedData();
      if (onSuccess) onSuccess(tripId);
    }
  });

  const { handleSelectTraveler, handleNewTraveler, handleNoTraveler } = useTripFormHelper({
    control: form.control,
    setValue: form.setValue
  });

  return {
    form,
    isSubmitting,
    isEditMode,
    tripDuration,
    formatTripDuration,
    travelers,
    searchTerm,
    setSearchTerm,
    handleSelectTraveler,
    handleNewTraveler,
    handleNoTraveler,
    onSubmit: form.handleSubmit(originalSubmit),
    clearSavedData,
  };
}
