const fs = require("fs");

const getLocalDataFile = () => {
  let localDataFile = process.env.HOME;
  if (!localDataFile) {
    localDataFile = process.env.LOCALAPPDATA;
  }
  return localDataFile;
};

function saveData(path, value) {
  fs.writeFileSync(path, JSON.stringify(value));
}

function getData(path, defaultValue) {
  try {
    return JSON.parse(fs.readFileSync(path, "utf8"));
  } catch (e) {
    return defaultValue || undefined;
  }
}

const isArray =
  Array.isArray ||
  function(object) {
    return object instanceof Array;
  };

function isPlainObject(obj) {
  return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
}

function isObject(obj) {
  return typeof obj == "object";
}

function extend(target, source, deep) {
  for (let key in source)
    if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
      if (isPlainObject(source[key]) && !isPlainObject(target[key]))
        target[key] = {};
      if (isArray(source[key]) && !isArray(target[key])) target[key] = [];
      extend(target[key], source[key], deep);
    } else if (source[key] !== undefined) target[key] = source[key];
}

module.exports = {
  getLocalDataFile,
  saveData,
  getData,
  extend,
};
