'use strict';

const { EventEmitter } = require('events');
const List = require('./list');
const moment = require('moment');

// this list must have entries with sorted ttl range
module.exports = class FIFOTTLList extends EventEmitter {
    constructor ({
        interval = 1000,
        expireAmount = 1,
        expireType = 'hours',
    } = {}) {
        super();
        this.expireAmount = expireAmount;
        this.expireType = expireType;

        this.list = new List();

        this.list.on('evicted', ({ value, ttl }) => {
            this.emit('expire', value, ttl);
        });

        this.timer = setInterval(() => {
            this.timedCheck();
        }, interval);
    }

    add (value, timestamp = new Date()) {
        const ttl = moment(timestamp).add(this.expireAmount, this.expireType);
        this.list.add({ ttl, value });
    }

    timedCheck () {
        const now = moment(new Date());
        this.list.reverseRemoveUntilTrue(({ value }) => now.isBefore(value.ttl));
    }

    destroy () {
        clearTimeout(this.timer);
        delete this.timer;
        this.list = null;
    }
};