import { useEffect, useState } from 'react';

function useAvailableDateRange(takenDates: Date[] | null, rangeLength: number = 7) {
  const [startDate, setStartDate] = useState<Date | null>(null);
  const [endDate, setEndDate] = useState<Date | null>(null);

  useEffect(() => {
    if (takenDates === null) {
      return;
    }

    if (takenDates && takenDates.length === 0) {
      const today = new Date();
      const end = new Date(today);
      end.setDate(today.getDate() + (rangeLength - 1));
      setStartDate(today);
      setEndDate(end);
      return;
    }

    const takenSet = new Set(takenDates.map(date => new Date(date).toDateString()));
    let current = new Date();
    current.setHours(0, 0, 0, 0);

    const isRangeFree = (start: Date) => {
      for (let i = 0; i < rangeLength; i++) {
        const checkDate = new Date(start);
        checkDate.setDate(start.getDate() + i);
        if (takenSet.has(checkDate.toDateString())) {
          return false;
        }
      }
      return true;
    };

    while (true) {
      if (isRangeFree(current)) {
        const end = new Date(current);
        end.setDate(current.getDate() + (rangeLength - 1));
        setStartDate(new Date(current));
        setEndDate(end);
        break;
      }
      current.setDate(current.getDate() + 1);
    }
  }, [takenDates, rangeLength]);

  return { startDate, endDate };
}

export default useAvailableDateRange;
