/*
 * vim: ts=4:sw=4:expandtab
 */

;(function() {
    'use strict';
    window.Whisper = window.Whisper || {};

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

    var enabled = false;
    var sound = new Audio('audio/NewMessage.mp3');

    Whisper.Notifications = new (Backbone.Collection.extend({
        initialize: function() {
            this.on('add', this.update);
            this.on('remove', this.onRemove);
        },
        onClick: function(conversationId) {
            var conversation = ConversationController.get(conversationId);
            this.trigger('click', conversation);
        },
        update: function() {
            console.log(
                'updating notifications - count:', this.length,
                'focused:', window.isFocused(),
                'enabled:', enabled
            );
            if (!enabled) {
                return; // wait til we are re-enabled
            }
            if (this.length === 0) {
                return;
            }
            if (window.isFocused()) {
                // The window is focused. Consider yourself notified.
                this.clear();
                return;
            }

            var audioNotification = storage.get('audio-notification') || false;
            if (audioNotification) {
                sound.play();
            }

            var setting = storage.get('notification-setting') || 'message';
            if (setting === SETTINGS.OFF) {
                return;
            }

            window.drawAttention();

            var title;
            var message;
            var iconUrl;

            var newMessageCount = [
                this.length,
                this.length === 1 ? i18n('newMessage') : i18n('newMessages')
            ].join(' ');

            var last = this.last();
            switch (this.getSetting()) {
              case SETTINGS.COUNT:
                title = 'Signal';
                message = newMessageCount;
                break;
              case SETTINGS.NAME:
                title = newMessageCount;
                message = 'Most recent from ' + last.get('title');
                iconUrl = last.get('iconUrl');
                break;
              case SETTINGS.MESSAGE:
                if (this.length === 1) {
                  title = last.get('title');
                } else {
                  title = newMessageCount;
                }
                message = last.get('message');
                iconUrl = last.get('iconUrl');
                break;
            }

            if (window.config.polyfillNotifications) {
                window.nodeNotifier.notify({
                    title: title,
                    message: message,
                    sound: false
                });
                window.nodeNotifier.on('click', function(notifierObject, options) {
                    last.get('conversationId');
                });
            } else {
                var notification = new Notification(title, {
                    body   : message,
                    icon   : iconUrl,
                    tag    : 'signal',
                    silent : true
                });

                notification.onclick = this.onClick.bind(this, last.get('conversationId'));
            }

            // We don't want to notify the user about these same messages again
            this.clear();
        },
        getSetting: function() {
            return storage.get('notification-setting') || SETTINGS.MESSAGE;
        },
        onRemove: function() {
            console.log('remove notification');
        },
        clear: function() {
            console.log('remove all notifications');
            this.reset([]);
        },
        enable: function() {
            var update = !enabled;
            enabled = true;
            if (update) {
              this.update();
            }
        },
        disable: function() {
            enabled = false;
        },

    }))();
})();