const Level = {
    Off: 0,
    Error: 1,
    Warn: 2,
    Info: 3,
    Debug: 4,
    All: 5
};

const MaxLogsToSave = 100;

const lastLogs = [];

const Logger = function(name, id, level = Level.All) {
    this.prefix = name ? name + (id ? ':' + id : '') : 'default';
    this.level = level;
};

Logger.prototype.ts = function(ts) {
    if (ts) {
        return Math.round(performance.now() - ts) + 'ms';
    } else {
        return performance.now();
    }
};

Logger.prototype.getPrefix = function() {
    return new Date().toISOString() + ' [' + this.prefix + '] ';
};

Logger.prototype.debug = function(...args) {
    args[0] = this.getPrefix() + args[0];
    if (this.level >= Level.Debug) {
        Logger.saveLast('debug', args);
        console.log(...args); // eslint-disable-line no-console
    }
};

Logger.prototype.info = function(...args) {
    args[0] = this.getPrefix() + args[0];
    if (this.level >= Level.Info) {
        Logger.saveLast('info', args);
        console.info(...args); // eslint-disable-line no-console
    }
};

Logger.prototype.warn = function(...args) {
    args[0] = this.getPrefix() + args[0];
    if (this.level >= Level.Warn) {
        Logger.saveLast('warn', args);
        console.warn(...args); // eslint-disable-line no-console
    }
};

Logger.prototype.error = function(...args) {
    args[0] = this.getPrefix() + args[0];
    if (this.level >= Level.Error) {
        Logger.saveLast('error', args);
        console.error(...args); // eslint-disable-line no-console
    }
};

Logger.prototype.setLevel = function(level) {
    this.level = level;
};

Logger.prototype.getLevel = function() {
    return this.level;
};

Logger.saveLast = function(level, args) {
    lastLogs.push({ level, args: Array.prototype.slice.call(args) });
    if (lastLogs.length > MaxLogsToSave) {
        lastLogs.shift();
    }
};

Logger.getLast = function() {
    return lastLogs;
};

Logger.Level = Level;

export { Logger };
