"use strict";

exports.__esModule = true;
exports.save = save;
exports.isFresh = isFresh;
exports.load = load;

var _readJsonSafe = require("read-json-safe");

var _writeJsonSafe = require("write-json-safe");

var _typesJson = require("types-json");

var _ = require("./");

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function isPositiveNumber(value) {
  return typeof value === "number" && value >= 0;
}

function filterStringArray(array) {
  return array.filter(function (value) {
    return typeof value === "string";
  });
}

var saveTemplate = {
  since: 0,
  timestamp: 0,
  packageNames: []
};
var cache;

function save(_x) {
  return _save.apply(this, arguments);
}

function _save() {
  _save = _asyncToGenerator(function* (data) {
    cache = data;
    return (0, _writeJsonSafe.writeJSON)(_.savePath, data, {
      pretty: false
    });
  });
  return _save.apply(this, arguments);
}

function isFresh(_ref, maxAge) {
  var timestamp = _ref.timestamp;

  if (maxAge === void 0) {
    maxAge = 0;
  }

  return timestamp + maxAge > new Date().getTime();
}

function load(_x2) {
  return _load.apply(this, arguments);
}

function _load() {
  _load = _asyncToGenerator(function* (options) {
    if (cache !== undefined && isFresh(cache, options == null ? void 0 : options.maxAge)) {
      return Promise.resolve(cache);
    } else {
      return (0, _readJsonSafe.readJSON)(_.savePath).then(function (data) {
        if ((0, _typesJson.isJSONObject)(data)) {
          cache = {
            since: isPositiveNumber(data.since) ? data.since : saveTemplate.since,
            timestamp: isPositiveNumber(data.timestamp) ? data.timestamp : saveTemplate.timestamp,
            packageNames: Array.isArray(data.packageNames) ? filterStringArray(data.packageNames) : saveTemplate.packageNames
          };
        } else {
          cache = saveTemplate;
        }

        return cache;
      });
    }
  });
  return _load.apply(this, arguments);
}