import {addMinutes, format, isWithinInterval} from "date-fns";
import {fr} from "date-fns/locale";
import {DateInterval} from "./types";
import {jourLabelDate} from "./date.functions";

export const extractHMS = (time: string) => {
  const [hours, minutes, seconds] = time.split(":");
  return { hours, minutes, seconds };
};

export const hTime = (time: string) => {
  const arr = time.split(":");
  return arr[0] + "h" + arr[1];
};

export const hMSToTime = (params: {
  hours: number;
  minutes: number;
  seconds: number;
}) => {
  const { hours, minutes, seconds } = params;
  return `${hours}:${minutes}:${seconds}`;
};

export const setTime = (date: Date, time: string) => {
  const copy = new Date(date);
  const { hours, minutes, seconds } = extractHMS(time);
  copy.setHours(Number(hours));
  copy.setMinutes(Number(minutes));
  copy.setSeconds(Number(seconds));
  return copy;
};

export type CreerIntervalOptions = {
  dureeDuCreneau?: number;
  creneauxBloques?: DateInterval[];
};

export type Creneau = {
  value: string;
  label: string;
  start: Date;
  end: Date;
  intervalLabel: string;
  jourLabel: string;
  disabled?: boolean;
};

export const creerIntervals = (
  start: Date,
  end: Date,
  options: CreerIntervalOptions = {}
) => {
  const { dureeDuCreneau = 15, creneauxBloques = [] } = options;

  const creneaux: Creneau[] = [];
  let debut = new Date(start);
  const fin = new Date(end);

  while (debut < fin) {
    const debutCreneau = debut;
    const creneauDebut = format(debut, "HH:mm", { locale: fr });

    debut = addMinutes(debut, dureeDuCreneau);
    const creneauFin = format(debut, "HH:mm", { locale: fr });

    const creneau: Creneau = {
      value: creneauDebut,
      label: hTime(creneauDebut),
      intervalLabel: `${creneauDebut} - ${creneauFin}`,
      jourLabel: jourLabelDate(debutCreneau)!,
      start: debutCreneau,
      end: debut,
      disabled: creneauxBloques.some((creneauBloque) =>
        isWithinInterval(debut, creneauBloque as any)
      ),
    };

    creneaux.push(creneau);
  }

  return creneaux;
};

// Convertir une date/heure locale en UTC
export const convertLocalToUtc = (localString: string): string => {
  const date = new Date(localString);
  return date.toISOString();
};

// Convertir une date/heure UTC en locale
export const convertUtcToLocal = (utcString: string): string => {
  const utcDate = new Date(utcString);
  const localDate = new Date(utcDate.getTime() - utcDate.getTimezoneOffset() * 60000); // Ajouter le décalage
  return localDate.toISOString().slice(0, -1); // Supprimer le "Z"
};