'use strict';
define(
    [
        'app',
        'marionette',
        'Commands/CommandController',
        'Shared/Messenger'
    ], function (App, Marionette, CommandController, Messenger) {

        return Marionette.ItemView.extend({
            template : 'Shared/Toolbar/ButtonTemplate',
            className: 'btn',

            events: {
                'click': 'onClick'
            },

            ui: {
                icon: '.x-icon'
            },


            initialize: function () {
                this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key');
                this.idle = true;
            },

            onRender: function () {
                if (this.model.get('active')) {
                    this.$el.addClass('active');
                    this.invokeCallback();
                }

                if(!this.model.get('title')){
                    this.$el.addClass('btn-icon-only');
                }
            },

            onClick: function () {
                if (this.idle) {
                    this.invokeCallback();
                    this.invokeRoute();
                    this.invokeCommand();
                }
            },

            invokeCommand: function () {
                //TODO: Use Actioneer to handle icon swapping

                var command = this.model.get('command');
                if (command) {
                    this.idle = false;
                    this.$el.addClass('disabled');
                    this.ui.icon.addClass('icon-spinner icon-spin');

                    var self = this;
                    var commandPromise = CommandController.Execute(command);
                    commandPromise.done(function () {
                        if (self.model.get('successMessage')) {
                            Messenger.show({
                                message: self.model.get('successMessage')
                            });
                        }

                        if (self.model.get('onSuccess')) {
                            if (!self.model.ownerContext) {
                                throw 'ownerContext must be set.';
                            }

                            self.model.get('onSuccess').call(self.model.ownerContext);
                        }
                    });

                    commandPromise.fail(function (options) {
                        if (options.readyState === 0 || options.status === 0) {
                            return;
                        }

                        if (self.model.get('errorMessage')) {
                            Messenger.show({
                                message: self.model.get('errorMessage'),
                                type   : 'error'
                            });
                        }

                        if (self.model.get('onError')) {
                            if (!self.model.ownerContext) {
                                throw 'ownerContext must be set.';
                            }

                            self.model.get('onError').call(self.model.ownerContext);
                        }
                    });

                    commandPromise.always(function () {
                        if (!self.isClosed) {
                            self.$el.removeClass('disabled');
                            self.ui.icon.removeClass('icon-spinner icon-spin');
                            self.idle = true;
                        }
                    });

                    if (self.model.get('always')) {
                        if (!self.model.ownerContext) {
                            throw 'ownerContext must be set.';
                        }

                        self.model.get('always').call(self.model.ownerContext);
                    }
                }
            },

            invokeRoute: function () {
                var route = this.model.get('route');
                if (route) {

                    require(
                        [
                            'Router'
                        ], function () {
                            App.Router.navigate(route, {trigger: true});
                        });
                }
            },

            invokeCallback: function () {

                if (!this.model.ownerContext) {
                    throw 'ownerContext must be set.';
                }

                var callback = this.model.get('callback');
                if (callback) {
                    callback.call(this.model.ownerContext);
                }
            }

        });
    });




