'use strict';
define([
    'underscore',
    'marionette',
    'backgrid',
    'Wanted/Cutoff/CutoffUnmetCollection',
    'Cells/SeriesTitleCell',
    'Cells/EpisodeNumberCell',
    'Cells/EpisodeTitleCell',
    'Cells/RelativeDateCell',
    'Cells/EpisodeStatusCell',
    'Shared/Grid/Pager',
    'Shared/Toolbar/ToolbarLayout',
    'Shared/LoadingView',
    'Shared/Messenger',
    'Commands/CommandController',
    'backgrid.selectall',
    'Mixins/backbone.signalr.mixin'
], function (_,
             Marionette,
             Backgrid,
             CutoffUnmetCollection,
             SeriesTitleCell,
             EpisodeNumberCell,
             EpisodeTitleCell,
             RelativeDateCell,
             EpisodeStatusCell,
             GridPager,
             ToolbarLayout,
             LoadingView,
             Messenger,
             CommandController) {
    return Marionette.Layout.extend({
        template : 'Wanted/Cutoff/CutoffUnmetLayoutTemplate',

        regions : {
            cutoff  : '#x-cutoff-unmet',
            toolbar : '#x-toolbar',
            pager   : '#x-pager'
        },

        ui : {
            searchSelectedButton : '.btn i.icon-search'
        },

        columns : [
            {
                name      : '',
                cell      : 'select-row',
                headerCell: 'select-all',
                sortable  : false
            },
            {
                name      : 'series',
                label     : 'Series Title',
                cell      : SeriesTitleCell,
                sortValue : 'series.sortTitle'
            },
            {
                name      : 'this',
                label     : 'Episode',
                cell      : EpisodeNumberCell,
                sortable  : false
            },
            {
                name      : 'this',
                label     : 'Episode Title',
                cell      : EpisodeTitleCell,
                sortable  : false
            },
            {
                name      : 'airDateUtc',
                label     : 'Air Date',
                cell      : RelativeDateCell
            },
            {
                name      : 'status',
                label     : 'Status',
                cell      : EpisodeStatusCell,
                sortable  : false
            }
        ],

        initialize : function () {
            this.collection = new CutoffUnmetCollection().bindSignalR({ updateOnly: true });

            this.listenTo(this.collection, 'sync', this._showTable);
        },

        onShow : function () {
            this.cutoff.show(new LoadingView());
            this._showToolbar();
            this.collection.fetch();
        },

        _showTable : function () {
            this.cutoffGrid = new Backgrid.Grid({
                columns    : this.columns,
                collection : this.collection,
                className  : 'table table-hover'
            });

            this.cutoff.show(this.cutoffGrid);

            this.pager.show(new GridPager({
                columns    : this.columns,
                collection : this.collection
            }));
        },

        _showToolbar : function () {
            var leftSideButtons = {
                type       : 'default',
                storeState : false,
                items      : [
                    {
                        title        : 'Search Selected',
                        icon         : 'icon-search',
                        callback     : this._searchSelected,
                        ownerContext : this,
                        className    : 'x-search-selected'
                    },
                    {
                        title : 'Season Pass',
                        icon  : 'icon-bookmark',
                        route : 'seasonpass'
                    }
                ]
            };

            var filterOptions = {
                type          : 'radio',
                storeState    : false,
                menuKey       : 'wanted.filterMode',
                defaultAction : 'monitored',
                items         : [
                    {
                        key      : 'monitored',
                        title    : '',
                        tooltip  : 'Monitored Only',
                        icon     : 'icon-nd-monitored',
                        callback : this._setFilter
                    },
                    {
                        key      : 'unmonitored',
                        title    : '',
                        tooltip  : 'Unmonitored Only',
                        icon     : 'icon-nd-unmonitored',
                        callback : this._setFilter
                    }
                ]
            };

            this.toolbar.show(new ToolbarLayout({
                left    : [
                    leftSideButtons
                ],
                right   : [
                    filterOptions
                ],
                context : this
            }));

            CommandController.bindToCommand({
                element : this.$('.x-search-selected'),
                command : {
                    name : 'episodeSearch'
                }
            });
        },

        _setFilter : function (buttonContext) {
            var mode = buttonContext.model.get('key');

            this.collection.state.currentPage = 1;
            var promise = this.collection.setFilterMode(mode);

            if (buttonContext) {
                buttonContext.ui.icon.spinForPromise(promise);
            }
        },

        _searchSelected : function () {
            var selected = this.cutoffGrid.getSelectedModels();

            if (selected.length === 0) {
                Messenger.show({
                    type    : 'error',
                    message : 'No episodes selected'
                });

                return;
            }

            var ids = _.pluck(selected, 'id');

            CommandController.Execute('episodeSearch', {
                name       : 'episodeSearch',
                episodeIds : ids
            });
        }
    });
});
