const Sakuya = (function() {
    const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });
    const divisions = [
        { amount: 60, name: 'seconds' },
        { amount: 60, name: 'minutes' },
        { amount: 24, name: 'hours' },
        { amount: 7, name: 'days' },
        { amount: 4.34524, name: 'weeks' },
        { amount: 12, name: 'months' },
        { amount: Infinity, name: 'years' },
    ];

    const formatTimeAgo = function(date) {
        let duration = (date - new Date()) / 1000;

        for(const div of divisions) {
            if(Math.abs(duration) < div.amount)
                return formatter.format(Math.round(duration), div.name);
            duration /= div.amount;
        }
    };

    // todo: update at intervals
    const trackElement = function(elem) {
        if(elem.dateTime === undefined)
            return;

        try {
            const dateTime = new Date(elem.dateTime);
            elem.textContent = formatTimeAgo(dateTime);
        } catch {}
    };

    const trackElements = function(elems) {
        for(const elem of elems)
            trackElement(elem);
    };

    return {
        formatTimeAgo: formatTimeAgo,
        trackElement: trackElement,
        trackElements: trackElements,
    };
})();
