var getTimer = function getTimer() {
  var timers = {};
  var setGetTime = function setGetTime(name) {
    if (!name) {
      log(ERROR_MESSAGES.timerNameRequired);
      return ERROR_MESSAGES.timerNameRequired;
    }
    if (timers[name]) {
      timers[name] = _extends({}, timers[name], {
        last: process.hrtime(),
        totalDuration: process.hrtime(timers[name].start),
        lastDuration: process.hrtime(timers[name].last)
      });
    } else {
      var time = process.hrtime();
      timers[name] = {
        start: time,
        last: time,
        totalDuration: null,
        lastDuration: null
      };
    }
    return timers[name];
  };
  var formatTime = function formatTime(time) {
    var humanReadable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

    if (!time) {
      return time;
    }
    var seconds = time[0];
    var miliseconds = time[1] / 1000000;
    if (humanReadable) {
      return seconds + 's ' + miliseconds + 'ms';
    }
    return { s: seconds, ms: miliseconds };
  };
  var formatTimes = function formatTimes(times$$1) {
    var humanReadable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

    if (!times$$1) {
      return times$$1;
    }
    return {
      start: formatTime(times$$1.start, humanReadable),
      last: formatTime(times$$1.last, humanReadable),
      totalDuration: formatTime(times$$1.totalDuration, humanReadable),
      lastDuration: formatTime(times$$1.lastDuration, humanReadable)
    };
  };
  var timeLog = function timeLog(name, tag) {
    for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
      args[_key2 - 2] = arguments[_key2];
    }

    console.log(chalk.blue.underline('' + name + (tag ? ':' + tag : ''))); // eslint-disable-line no-console
    return console.log(args.join('\n'), '\n'); // eslint-disable-line no-console
  };

  return {
    getTime: function getTime(name) {
      var humanReadable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      return formatTimes(timers[name], humanReadable);
    },
    time: function time(name) {
      var time = setGetTime(name);
      return formatTimes(time, false);
    },
    logTime: function logTime(name) {
      var tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

      var time = setGetTime(name);
      timeLog(name, tag, formatTime(time.lastDuration, true), 'Total: ' + formatTime(time.totalDuration, true));
      return time;
    }
  };
};