import { useCallback, useMemo } from 'react';
import { placesApi, tripPlacesApi } from '@/db/api';
import { useToast } from '@/hooks/use-toast';
import { useTripStore, useActiveDay } from '@/store/useTripStore';

/**
 * Seyahat yerlerini yönetmek için kullanılan hook
 * Yer ekleme, silme, sıralama ve aktif gün yerlerini alma işlemlerini yapar
 */
export const useTripPlaces = () => {
  const { toast } = useToast();
  const trip = useTripStore(state => state.trip);
  const activeDayId = useTripStore(state => state.activeDayId);
  const loadTrip = useTripStore(state => state.loadTrip);
  const activeDay = useActiveDay();

  // Aktif günün yerlerini getiren memoized getter
  const activeDayPlaces = useMemo(() => activeDay?.places || [], [activeDay]);

  // Yeni yer ekleme işlemi
  const addPlace = useCallback(async (placeId: string, dayIdOrTimeBlock: string) => {
    try {
      // Eğer ikinci parametre bir UUID ise dayId'dir, değilse timeBlock'tur
      const isDayId = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(dayIdOrTimeBlock);
      const targetDayId = isDayId ? dayIdOrTimeBlock : (activeDayId || '');
      const timeBlock = isDayId ? undefined : dayIdOrTimeBlock;

      if (!targetDayId) throw new Error('Gün seçilmedi.');

      const day = trip?.days.find(d => d.id === targetDayId);
      const currentCount = day?.places?.length || 0;

      await tripPlacesApi.addToDay({
        trip_day_id: targetDayId,
        place_id: placeId,
        order_index: currentCount,
        duration: '2 saat',
        time_block: timeBlock,
      });

      if (trip?.id) {
        await loadTrip(trip.id);
      }

      toast({
        title: 'Başarılı',
        description: 'Yer planınıza eklendi.',
      });
    } catch (error: any) {
      console.error('Yer ekleme hatası:', error);
      toast({
        title: 'Hata',
        description: error.message || 'Yer eklenirken bir hata oluştu.',
        variant: 'destructive',
      });
    }
  }, [trip, loadTrip, toast]);

  // Yer silme işlemi
  const removePlace = useCallback(async (tripPlaceId: string) => {
    try {
      await tripPlacesApi.remove(tripPlaceId);
      
      if (trip?.id) {
        await loadTrip(trip.id);
      }

      toast({
        title: 'Başarılı',
        description: 'Yer planınızdan kaldırıldı.',
      });
    } catch (error: any) {
      console.error('Yer silme hatası:', error);
      toast({
        title: 'Hata',
        description: error.message || 'Yer silinirken bir hata oluştu.',
        variant: 'destructive',
      });
    }
  }, [trip, loadTrip, toast]);

  // Yerleri yeniden sıralama işlemi
  const reorderPlaces = useCallback(async (activeId: string, overId: string) => {
    if (!activeDayId || !trip) return;

    try {
      const places = [...activeDayPlaces];
      const oldIndex = places.findIndex((p) => (p.tripPlaceId || p.id) === activeId);
      const newIndex = places.findIndex((p) => (p.tripPlaceId || p.id) === overId);

      if (oldIndex !== -1 && newIndex !== -1) {
        const movedItem = places.splice(oldIndex, 1)[0];
        places.splice(newIndex, 0, movedItem);

        const updates = places.map((p, index) => ({
          tripPlaceId: p.tripPlaceId || p.id,
          orderIndex: index,
        }));

        await tripPlacesApi.updatePlacesOrder(activeDayId, updates);
        
        if (trip.id) {
          await loadTrip(trip.id);
        }
      }
    } catch (error: any) {
      console.error('Sıralama hatası:', error);
      toast({
        title: 'Hata',
        description: 'Sıralama güncellenirken bir hata oluştu.',
        variant: 'destructive',
      });
    }
  }, [activeDayId, activeDayPlaces, trip, loadTrip, toast]);

  // Yer arama mantığı
  const searchPlaces = useCallback(async (query: string) => {
    if (!query.trim()) return [];
    try {
      return await placesApi.search(query);
    } catch (error) {
      console.error('Yer arama hatası:', error);
      return [];
    }
  }, []);

  return {
    activeDayPlaces,
    addPlace,
    removePlace,
    reorderPlaces,
    searchPlaces,
  };
};
