#include channels.js
#include ui/messages.jsx

Umi.Messages = (function() {
    const msgs = new Map;

    return {
        Add: function(msg) {
            const msgId = msg.getId();
            if(!msgs.has(msgId)) {
                msgs.set(msgId, msg);
                Umi.UI.Messages.Add(msg);

                if(window.CustomEvent)
                    window.dispatchEvent(new CustomEvent('umi:message_add', {
                        detail: msg,
                    }));
            }
        },
        Remove: function(msg) {
            const msgId = msg.getId();
            if(msgs.has(msgId)) {
                msgs.delete(msgId);
                Umi.UI.Messages.Remove(msg);
            }
        },
        Clear: function() {
            msgs.clear();
            Umi.UI.Messages.RemoveAll();
        },
        All: function(channel, excludeNull) {
            if(!channel)
                return Array.from(msgs.values());

            if(!Umi.Channels.Get(channel))
                return null;

            const filtered = [];
            msgs.forEach(function(msg) {
                if(msg.getChannel() === channel || (!excludeNull && msg.getChannel() === null))
                    filtered.push(msg);
            });

            return filtered.slice(Math.max(filtered.length - 30, 0));
        },
        Get: function(msgId) {
            msgId = msgId.toString();
            if(msgs.has(msgId))
                return msgs.get(msgId);
            return null;
        },
    };
})();
