'use strict';
define(
    [
        'backgrid.paginator'
    ], function (Paginator) {

        return Paginator.extend({

            template: 'Shared/Grid/PagerTemplate',

            events: {
                'click .pager-btn': 'changePage'
            },

            windowSize: 1,

            fastForwardHandleLabels: {
                first: 'icon-fast-backward',
                prev : 'icon-backward',
                next : 'icon-forward',
                last : 'icon-fast-forward'
            },

            changePage: function (e) {
                e.preventDefault();

                var target = $(e.target);

                if (target.closest('li').hasClass('disabled')) {
                    return;
                }

                target.closest('li i').addClass('icon-spinner icon-spin');

                var label = target.attr('data-action');
                var ffLabels = this.fastForwardHandleLabels;

                var collection = this.collection;

                if (ffLabels) {
                    switch (label) {
                        case 'first':
                            collection.getFirstPage();
                            return;
                        case 'prev':
                            if (collection.hasPrevious()) {
                                collection.getPreviousPage();
                            }
                            return;
                        case 'next':
                            if (collection.hasNext()) {
                                collection.getNextPage();
                            }
                            return;
                        case 'last':
                            collection.getLastPage();
                            return;
                    }
                }

                var state = collection.state;
                var pageIndex = $(e.target).text() * 1;
                collection.getPage(state.firstPage === 0 ? pageIndex - 1 :pageIndex);
            },

            makeHandles: function () {

                var handles =
                    [
                    ];
                var collection = this.collection;
                var state = collection.state;

                // convert all indices to 0-based here
                var firstPage = state.firstPage;
                var lastPage = +state.lastPage;
                lastPage = Math.max(0, firstPage ? lastPage - 1 :lastPage);
                var currentPage = Math.max(state.currentPage, state.firstPage);
                currentPage = firstPage ? currentPage - 1 :currentPage;
                var windowStart = Math.floor(currentPage / this.windowSize) * this.windowSize;
                var windowEnd = Math.min(lastPage + 1, windowStart + this.windowSize);

                if (collection.mode !== 'infinite') {
                    for (var i = windowStart; i < windowEnd; i++) {
                        handles.push({
                            label       : i + 1,
                            title       : 'No. ' + (i + 1),
                            className   : currentPage === i ? 'active' :undefined,
                            pageNumber  : i + 1,
                            lastPage    : lastPage + 1
                        });
                    }
                }

                var ffLabels = this.fastForwardHandleLabels;
                if (ffLabels) {

                    if (ffLabels.prev) {
                        handles.unshift({
                            label    : ffLabels.prev,
                            className: collection.hasPrevious() ? void 0 :'disabled',
                            action   : 'prev'
                        });
                    }

                    if (ffLabels.first) {
                        handles.unshift({
                            label    : ffLabels.first,
                            className: collection.hasPrevious() ? void 0 :'disabled',
                            action   : 'first'
                        });
                    }

                    if (ffLabels.next) {
                        handles.push({
                            label    : ffLabels.next,
                            className: collection.hasNext() ? void 0 :'disabled',
                            action   : 'next'
                        });
                    }

                    if (ffLabels.last) {
                        handles.push({
                            label    : ffLabels.last,
                            className: collection.hasNext() ? void 0 :'disabled',
                            action   : 'last'
                        });
                    }
                }

                return handles;
            },

            render: function () {
                this.$el.empty();

                var templateFunction = Marionette.TemplateCache.get(this.template);

                this.$el.html(templateFunction({
                    handles: this.makeHandles(),
                    state: this.collection.state
                }));

                this.delegateEvents();

                return this;
            }
        });
    });
