/*
 * vim: ts=4:sw=4:expandtab
 */
;(function() {
    'use strict';
    window.Whisper = window.Whisper || {};

    var SETTINGS = {
        OFF     : 'off',
        COUNT   : 'count',
        NAME    : 'name',
        MESSAGE : 'message'
    };

    Whisper.Notifications = new (Backbone.Collection.extend({
        initialize: function() {
            this.on('add', _.debounce(this.update.bind(this), 1000));
            this.on('remove', this.onRemove);
        },
        onclick: function() {
            var last = this.last();
            if (!last) {
                openInbox();
                return;
            }
            var conversation = ConversationController.create({
                id: last.get('conversationId')
            });
            openConversation(conversation);
            this.clear();
        },
        update: function() {
            console.log('updating notifications', this.length);
            extension.notification.clear();
            if (this.length === 0) {
                return;
            }
            var setting = storage.get('notification-setting') || 'message';
            if (setting === SETTINGS.OFF) {
                return;
            }

            var iconUrl = 'images/icon_128.png';
            var title = [
                this.length,
                this.length === 1 ? i18n('newMessage') : i18n('newMessages')
            ].join(' ');

            if (setting === SETTINGS.COUNT) {
                extension.notification.update({
                    type     : 'basic',
                    title    : title,
                    iconUrl  : iconUrl
                });
                return;
            }

            if (this.length > 1) {
                var conversationIds = _.uniq(this.map(function(m) {
                    return m.get('conversationId');
                }));
                if (conversationIds.length === 1 && this.showSender()) {
                    iconUrl = this.at(0).get('iconUrl');
                }
                extension.notification.update({
                    type    : 'list',
                    iconUrl : iconUrl,
                    title   : title,
                    message : 'Most recent from ' + this.last().get('title'),
                    items   : this.map(function(m) {
                        var message, title;
                        if (this.showMessage()) {
                            return {
                                title   : m.get('title'),
                                message : m.get('message')
                            };
                        } else if (this.showSender()) {
                            return {
                                title   : m.get('title'),
                                message : i18n('newMessage')
                            };
                        }
                    }.bind(this)),
                    buttons : [{
                        title   : 'Mark all as read',
                        iconUrl : 'images/check.svg'
                    }]
                });
            } else {
                var m = this.at(0);
                var type = 'basic';
                var message = i18n('newMessage');
                var imageUrl;
                if (this.showMessage()) {
                    message = m.get('message');
                    if (m.get('imageUrl')) {
                        type = 'image';
                        imageUrl = m.get('imageUrl');
                    }
                }
                if (this.showSender()) {
                    title = m.get('title');
                    iconUrl = m.get('iconUrl');
                }
                extension.notification.update({
                    type     : type,
                    title    : title,
                    message  : message,
                    iconUrl  : iconUrl,
                    imageUrl : imageUrl
                });
            }
        },
        getSetting: function() {
            return storage.get('notification-setting') || 'message';
        },
        showMessage: function() {
            return this.getSetting() === SETTINGS.MESSAGE;
        },
        showSender: function() {
            var setting = this.getSetting();
            return (setting === SETTINGS.MESSAGE || setting === SETTINGS.NAME);
        },
        onRemove: function() {
            console.log('remove notification');
            if (this.length === 0) {
                extension.notification.clear();
                return;
            }
        },
        clear: function() {
            this.reset([]);
        }
    }))();
})();