/**
 * Загрузчик JSON данных
 */
export class DataLoader {
  constructor() {
    this.cache = new Map();
  }

  /**
   * Загрузка данных с кешированием
   * @param {string} url - URL для загрузки
   * @param {boolean} useCache - Использовать кеш
   * @returns {Promise<any>}
   */
  async load(url, useCache = true) {
    if (useCache && this.cache.has(url)) {
      return this.cache.get(url);
    }

    try {
      const response = await fetch(url);

      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      const data = await response.json();

      if (useCache) {
        this.cache.set(url, data);
      }

      return data;
    } catch (error) {
      console.error(`Ошибка загрузки данных из ${url}:`, error);
      throw error;
    }
  }

  /**
   * Загрузка нескольких источников данных
   * @param {string[]} urls - Массив URL
   * @returns {Promise<any[]>}
   */
  async loadMultiple(urls) {
    try {
      const promises = urls.map(url => this.load(url));
      return await Promise.all(promises);
    } catch (error) {
      console.error('Ошибка загрузки множественных данных:', error);
      throw error;
    }
  }

  /**
   * Очистка кеша
   */
  clearCache() {
    this.cache.clear();
  }
}

// Экземпляр загрузчика
const dataLoader = new DataLoader();

/**
 * Простая функция загрузки данных
 * @param {string} url - URL для загрузки
 * @returns {Promise<any>}
 */
export const loadData = url => dataLoader.load(url);
