'use strict'; var _ = require('underscore'); var cache = require('../cache'); var h = require('../helper'); var log = require('../log'); var Plugin = require('../plugin'); var session = require('../session'); const plugin = new Plugin(50, 'cache', '', 'Plugin to provide local cache.'); plugin.getProblems = function(cb) { const problems = cache.get(h.KEYS.problems); if (problems) { log.debug('cache hit: problems.json'); return cb(null, problems); } plugin.next.getProblems(function(e, problems) { if (e) return cb(e); cache.set(h.KEYS.problems, problems); return cb(null, problems); }); }; plugin.getProblem = function(problem, cb) { const k = h.KEYS.problem(problem); const _problem = cache.get(k); if (_problem) { if (!_problem.desc.includes('
')) {
      // do not hit problem without html tags in desc (
 always exists for presenting testcase)
      log.debug('cache discarded for being no longer valid: ' + k + '.json');
    } else if (!['likes', 'dislikes'].every(p => p in _problem)) {
      // do not hit problem without likes & dislikes (logic will be improved in new lib)
      log.debug('cache discarded for being too old: ' + k + '.json');
    } else {
      // cache hit
      log.debug('cache hit: ' + k + '.json');
      _.extendOwn(problem, _problem);
      return cb(null, problem);
    }
  }

  plugin.next.getProblem(problem, function(e, _problem) {
    if (e) return cb(e);

    plugin.saveProblem(_problem);
    return cb(null, _problem);
  });
};

plugin.saveProblem = function(problem) {
  // it would be better to leave specific problem cache being user
  // independent, thus try to reuse existing cache as much as possible
  // after changing user.
  const _problem = _.omit(problem, ['locked', 'state', 'starred']);
  return cache.set(h.KEYS.problem(problem), _problem);
};

plugin.updateProblem = function(problem, kv) {
  const problems = cache.get(h.KEYS.problems);
  if (!problems) return false;

  const _problem = problems.find(x => x.id === problem.id);
  if (!_problem) return false;

  _.extend(_problem, kv);
  return cache.set(h.KEYS.problems, problems);
};

plugin.login = function(user, cb) {
  this.logout(user, false);
  plugin.next.login(user, function(e, user) {
    if (e) return cb(e);
    session.saveUser(user);
    return cb(null, user);
  });
};

plugin.logout = function(user, purge) {
  if (!user) user = session.getUser();
  if (purge) session.deleteUser();
  // NOTE: need invalidate any user related cache
  session.deleteCodingSession();
  return user;
};

module.exports = plugin;