/**
 * Выводит лог в зависимости от установки переменной окружения DEBUG
 *
 * @export
 * @param {string} item строка для вывода в лог
 */
export function debugLog(...items) {
  if (process.env.DEBUG === true || process.env.DEBUG === 'true') {
    console.log(...items);
  }
}

/** Возвращает url бакенда в зависимости от контекста
 * @returns {string}
 */
export function getAPIurl() {
  if (process.env.MODE === 'capacitor') {
    return (
      process.env.CAPACITOR_GRAPHQL_URI ||
      process.env.GRAPHQL_URI ||
      'http://localhost:8000/api/v1.1/'
    ).replace(/['"]/g, '');
  } else
    return (
      process.env.GRAPHQL_URI || 'http://localhost:8000/api/v1.1/'
    ).replace(/['"]/g, '');
}

/**
 * Возвращает копию переданного в аргументе
 *
 * @export
 * @param {*} obj
 * @return {*}
 */
export function copy(obj) {
  function copyProps(clone) {
    for (let key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        clone[key] = copy(obj[key]);
      }
    }
  }

  /**
   * Создание иммутабельной копии объекта
   * @return {Object}
   */
  function cloneObj() {
    let clone = {};
    copyProps(clone);
    return clone;
  }

  /**
   * Создание иммутабельной копии массива
   * @return {Array}
   */
  function cloneArr() {
    return obj.map(function (item) {
      return copy(item);
    });
  }

  /**
   * Создание иммутабельной копии Map
   * @return {Map}
   */
  function cloneMap() {
    let clone = new Map();
    for (let [key, val] of obj) {
      clone.set(key, copy(val));
    }
    return clone;
  }

  /**
   * Создание иммутабельной копии Set
   * @return {Set}
   */
  function cloneSet() {
    let clone = new Set();
    for (let item of obj) {
      clone.add(copy(item));
    }
    return clone;
  }

  /**
   * Создание иммутабельной копии функции
   * @return {Function}
   */
  function cloneFunction() {
    let clone = obj.bind(this);
    copyProps(clone);
    return clone;
  }

  // Получение типа объекта
  let type = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

  // Возвращаем копию в зависимости от типа исходных данных
  if (type === 'object') return cloneObj();
  if (type === 'array') return cloneArr();
  if (type === 'map') return cloneMap();
  if (type === 'set') return cloneSet();
  if (type === 'function') return cloneFunction();

  return obj;
}
