import type { Event } from "@/entities/event";
import type { EventPlace } from "@/entities/place";
import { formatUsdt } from "@/shared/lib/money/usdt";
import { addDays } from "date-fns";
import { isDateAvailable, setToMidday } from "../model/formSchema";
import type { EventFormOutput } from "../model/types";
import { extractBookedRangesForPlace } from "./extractBookedRangesForPlace";

type PartialPlace = Pick<
  EventFormOutput,
  "ticketPrice" | "place" | "startDate" | "daysAmount"
>;

export const getPlaceDefaults = (
  place: EventPlace,
  events: Event[],
  excludedEventsId?: number[],
): PartialPlace => {
  const daysAmount = place.minDays;
  const daysBeforedCancel = place.daysBeforeCancel;

  const currentRanges = extractBookedRangesForPlace(
    events,
    place,
    excludedEventsId,
  );

  const getFirstAvailableDate = (): Date => {
    let initial = setToMidday(new Date());
    while (
      !isDateAvailable(initial, daysAmount, daysBeforedCancel, currentRanges)
    ) {
      initial = addDays(initial, 1);
    }
    return initial;
  };

  return {
    ticketPrice: formatUsdt(BigInt(place.minPrice)),
    place: `${place.id}`,
    startDate: getFirstAvailableDate(),
    daysAmount,
  };
};

Graph