/**
 * Дебаунс функция
 * @param {Function} func - Функция для дебаунса
 * @param {number} wait - Время ожидания в мс
 * @returns {Function}
 */
export const debounce = (func, wait) => {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
};

/**
 * Троттлинг функция
 * @param {Function} func - Функция для троттлинга
 * @param {number} limit - Лимит времени в мс
 * @returns {Function}
 */
export const throttle = (func, limit) => {
  let inThrottle;
  return function (...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => (inThrottle = false), limit);
    }
  };
};

/**
 * Получение параметров URL
 * @returns {Object}
 */
export const getUrlParams = () => {
  return Object.fromEntries(new URLSearchParams(window.location.search));
};

/**
 * Форматирование даты
 * @param {Date|string} date - Дата для форматирования
 * @param {string} locale - Локаль
 * @returns {string}
 */
export const formatDate = (date, locale = 'ru-RU') => {
  return new Intl.DateTimeFormat(locale, {
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  }).format(new Date(date));
};

/**
 * Проверка поддержки WebP
 * @returns {Promise<boolean>}
 */
export const supportsWebP = () => {
  return new Promise(resolve => {
    const webP = new Image();
    webP.onload = webP.onerror = () => {
      resolve(webP.height === 2);
    };
    webP.src =
      'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
  });
};

/**
 * Анимация счетчика
 * @param {HTMLElement} element - Элемент счетчика
 * @param {number} end - Конечное значение
 * @param {number} duration - Длительность анимации
 */
export const animateCounter = (element, end, duration = 2000) => {
  let start = 0;
  const increment = end / (duration / 16);

  const timer = setInterval(() => {
    start += increment;
    element.textContent = Math.floor(start);

    if (start >= end) {
      element.textContent = end;
      clearInterval(timer);
    }
  }, 16);
};
