import type { DateRange } from "react-day-picker";

import { addDays, format } from "date-fns";

import { cn } from "@/shared/lib/utils";
import { Button } from "@/shared/ui/button";
import { Calendar } from "@/shared/ui/calendar";
import { Popover, PopoverContent, PopoverTrigger } from "@/shared/ui/popover";
import { useState } from "react";
import { isDateAvailable } from "../model/formSchema";

type DatePickerProps = {
  date: Date;
  setDate: (date: Date | undefined) => void;
  selectedDuration: number;
  disabled: DateRange[];
  daysBeforeCancel: number;
};

export const DatePicker: React.FC<DatePickerProps> = ({
  date,
  setDate,
  selectedDuration,
  disabled: disabledRanges,
  daysBeforeCancel,
}) => {
  const [open, setOpen] = useState(false);

  const disabledDays = () => {
    const disabled = [];

    for (let i = 0; i <= 225; i++) {
      const date = addDays(new Date(), i);
      if (
        !isDateAvailable(
          date,
          selectedDuration,
          daysBeforeCancel,
          disabledRanges,
        )
      )
        disabled.push(date);
    }

    return disabled;
  };

  return (
    <div className={cn("grid gap-2")}>
      <Popover open={open} onOpenChange={setOpen}>
        <PopoverTrigger asChild>
          <Button
            id="date"
            clipping="noclip"
            className={cn(
              "border-2 border-input text-primary-foreground bg-input/10 p-5 w-full",
              "aria-invalid:ring-destructive/20 aria-invalid:border-destructive",
              !date && "text-muted-foreground",
            )}
          >
            {date ? format(date, "PPP") : <span>Pick a date</span>}
          </Button>
        </PopoverTrigger>
        <PopoverContent className="w-auto p-0" align="start">
          <Calendar
            initialFocus
            mode="single"
            selected={date}
            onSelect={(day) => {
              if (day == null) return;
              day?.setHours(date.getHours());
              day?.setMinutes(date.getMinutes());
              setDate(day);
              setOpen(false);
            }}
            defaultMonth={date}
            disabled={[{ before: new Date() }, ...disabledDays()]}
          />
        </PopoverContent>
      </Popover>
    </div>
  );
};

Graph