"use strict";

const recentChanges = (function() {
    const dialogEl = $("#recent-changes-dialog");

    async function showDialog() {
        glob.activeDialog = dialogEl;

        dialogEl.dialog({
            modal: true,
            width: 800,
            height: 700
        });

        const result = await $.ajax({
            url: baseApiUrl + 'recent-changes/',
            type: 'GET',
            error: () => error("Error getting recent changes.")
        });

        dialogEl.html('');

        const groupedByDate = groupByDate(result);

        for (const [dateDay, dayChanges] of groupedByDate) {
            const changesListEl = $('<ul>');

            const dayEl = $('<div>').append($('<b>').html(formatDate(dateDay))).append(changesListEl);

            for (const change of dayChanges) {
                const formattedTime = formatTime(getDateFromTS(change.date_modified_to));

                const revLink = $("<a>", {
                    href: 'javascript:',
                    text: 'rev'
                }).attr('action', 'note-history')
                    .attr('note-id', change.note_id)
                    .attr('note-history-id', change.note_history_id);

                changesListEl.append($('<li>')
                    .append(formattedTime + ' - ')
                    .append(link.createNoteLink(change.note_id))
                    .append(' (').append(revLink).append(')'));
            }

            dialogEl.append(dayEl);
        }
    }

    function groupByDate(result) {
        const groupedByDate = new Map();
        const dayCache = {};

        for (const row of result) {
            let dateDay = getDateFromTS(row.date_modified_to);
            dateDay.setHours(0);
            dateDay.setMinutes(0);
            dateDay.setSeconds(0);
            dateDay.setMilliseconds(0);

            // this stupidity is to make sure that we always use the same day object because Map uses only
            // reference equality
            if (dayCache[dateDay]) {
                dateDay = dayCache[dateDay];
            }
            else {
                dayCache[dateDay] = dateDay;
            }

            if (!groupedByDate.has(dateDay)) {
                groupedByDate.set(dateDay, []);
            }

            groupedByDate.get(dateDay).push(row);
        }
        return groupedByDate;
    }

    $(document).bind('keydown', 'alt+r', showDialog);

    return {
        showDialog
    };
})();