import { startOfWeek, endOfWeek, eachDayOfInterval, format } from 'date-fns';
import { fr } from 'date-fns/locale';

/**
 * Convertit une date string d'un format à un objet Date
 * @param {*} dateString
 * @param {*} format
 * @returns
 */
export function parseDate(dateString, format) {
  const formatParts = format.split(/[- :]/);
  const dateParts = dateString.split(/[- :]/);
  const dateMap = {};

  formatParts.forEach((part, index) => {
    dateMap[part] = parseInt(dateParts[index], 10);
  });

  return new Date(
    dateMap['YYYY'] || 0,
    (dateMap['MM'] || 1) - 1,
    dateMap['DD'] || 1,
    dateMap['hh'] || 0,
    dateMap['mm'] || 0,
    dateMap['ss'] || 0
  );
}

/**
 * Convertit un objet Date en une date string d'un format donné
 * @param {*} date
 * @param {*} toFormat
 * @returns
 */
export function formatDate(date, toFormat) {
  const padZero = (num) => (num < 10 ? '0' + num : num);
  const formatMap = {
    DD: padZero(date.getDate()),
    MM: padZero(date.getMonth() + 1),
    YYYY: date.getFullYear(),
    hh: padZero(date.getHours()),
    mm: padZero(date.getMinutes()),
    ss: padZero(date.getSeconds()),
  };

  return toFormat.replace(/DD|MM|YYYY|hh|mm|ss/g, (match) => formatMap[match]);
}

/**
 * Fonction qui convertit une date string d'un format à un autre format
 * @param {*} dateString
 * @param {*} fromFormat
 * @param {*} toFormat
 * @returns
 */
export function swapFormatDate(
  dateString,
  fromFormat = 'DD-MM-YYYY hh:mm:ss',
  toFormat = 'DD/MM/YYYY'
) {
  const date = parseDate(dateString, fromFormat);
  return formatDate(date, toFormat);
}
// ...existing code...

/**
 * Convertit une date en format ISO pour l'API
 */
export function toISOFormat(date) {
  return date.toISOString();
}

/**
 * Formate une date pour l'affichage dans le calendrier
 */
export function toCalendarFormat(date) {
  return formatDate(date, 'DD/MM/YYYY HH:mm');
}

/**
 * Vérifie si deux dates sont le même jour
 */
export function isSameDay(date1, date2) {
  return (
    date1.getFullYear() === date2.getFullYear() &&
    date1.getMonth() === date2.getMonth() &&
    date1.getDate() === date2.getDate()
  );
}

export const getWeekDays = (date) => {
  const start = startOfWeek(date, { locale: fr, weekStartsOn: 1 });
  const end = endOfWeek(date, { locale: fr, weekStartsOn: 1 });

  return eachDayOfInterval({ start, end });
};

export const isWeekend = (date) => {
  const day = date.getDay();
  return day === 0 || day === 6;
};

/**
 * Retourne l'année scolaire en cours au format "YYYY-YYYY".
 * Exemple : Si nous sommes en octobre 2023, retourne "2023-2024".
 */
export function getCurrentSchoolYear() {
  const now = new Date();
  const currentYear = now.getFullYear();
  const currentMonth = now.getMonth() + 1; // Les mois sont indexés à partir de 0

  // Si nous sommes avant septembre, l'année scolaire a commencé l'année précédente
  const startYear = currentMonth >= 9 ? currentYear : currentYear - 1;
  return `${startYear}-${startYear + 1}`;
}

/**
 * Retourne l'année scolaire suivante au format "YYYY-YYYY".
 * Exemple : Si nous sommes en octobre 2023, retourne "2024-2025".
 */
export function getNextSchoolYear() {
  const currentSchoolYear = getCurrentSchoolYear();
  const [startYear, endYear] = currentSchoolYear.split('-').map(Number);
  return `${startYear + 1}-${endYear + 1}`;
}

/**
 * Retourne un tableau des années scolaires passées au format "YYYY-YYYY".
 * Exemple : ["2022-2023", "2021-2022", "2020-2021"].
 * @param {number} count - Le nombre d'années scolaires passées à inclure.
 */
export function getHistoricalYears(count = 5) {
  const currentSchoolYear = getCurrentSchoolYear();
  const [startYear] = currentSchoolYear.split('-').map(Number);

  const historicalYears = [];
  for (let i = 1; i <= count; i++) {
    const historicalStartYear = startYear - i;
    historicalYears.push(`${historicalStartYear}-${historicalStartYear + 1}`);
  }

  return historicalYears;
}
