"use client";
import { useState, useMemo } from "react";
import { BookingSlot } from "@/_types/Types";
import { useTranslation } from "react-i18next";
import { dateTimeFormatter, formatCalendarDay } from "@/_utils/timezone";

export type UniqueLocation = {
  key: string; // "online" or String(location.id)
  id: number | null;
  name: string;
};

export function useExamBooking(
  exam?: { booking_slots?: BookingSlot[] } | null
) {
  const { i18n } = useTranslation("common");

  const [activeStep, setActiveStep] = useState<number>(0);
  const [selectedDate, setSelectedDate] = useState<string | null>(null);
  const [selectedLocationKey, setSelectedLocationKey] = useState<string | null>(
    null
  );
  const [selectedSlotId, setSelectedSlotId] = useState<number | null>(null);
  const [selectedTimezone, setSelectedTimezone] = useState<string>("");
  const [language, setLanguage] = useState<string>("");

  const slotsForDate = useMemo(() => {
    if (!exam || !selectedDate) return [];
    return (
      (exam.booking_slots || []).filter((session: BookingSlot) => {
        // start_time is "YYYY-MM-DD ..." in your original code
        return (
          dateTimeFormatter(session.start_time, "UTC") ===
          dateTimeFormatter(selectedDate, "UTC")
        );
      }) || []
    );
  }, [exam, selectedDate]);

  const uniqueDates = useMemo(() => {
    if (!exam?.booking_slots) return [];
    const mapped = exam.booking_slots.map((slot) => {
      const { weekday, day, month, label } = formatCalendarDay(
        slot.start_time,
        "UTC",
        i18n.language
      );
      const value = slot.start_time;
      return { label, value, weekday, day, month };
    });
    const unique = Array.from(
      new Map(mapped.map((d) => [d.label, d])).values()
    );

    return unique;
  }, [exam, i18n.language]);

  const uniqueLocations: UniqueLocation[] = useMemo(() => {
    return Array.from(
      new Map(
        (slotsForDate || []).map((s) => {
          const key = s.is_online
            ? "online"
            : String(s.location?.id ?? "unknown");
          const value: UniqueLocation = {
            key,
            id: s.is_online ? null : s.location?.id ?? null,
            name: s.is_online
              ? "Online"
              : s.location?.name ?? "Location unknown",
          };
          return [key, value] as const;
        })
      ).values()
    );
  }, [slotsForDate]);

  const filteredSessions = useMemo(() => {
    return selectedLocationKey
      ? slotsForDate.filter((session) =>
          selectedLocationKey === "online"
            ? !!session.is_online
            : session.location?.id === Number(selectedLocationKey)
        )
      : [];
  }, [slotsForDate, selectedLocationKey]);

  const reset = () => {
    setActiveStep(0);
    setSelectedDate(null);
    setSelectedLocationKey(null);
    setSelectedSlotId(null);
  };

  return {
    activeStep,
    setActiveStep,
    selectedDate,
    setSelectedDate,
    slotsForDate,
    selectedLocationKey,
    setSelectedLocationKey,
    selectedSlotId,
    setSelectedSlotId,
    uniqueLocations,
    filteredSessions,
    selectedTimezone,
    setSelectedTimezone,
    language,
    setLanguage,
    reset,
    uniqueDates,
  } as const;
}
