(function () {
    'use strict';

    angular
        .module('contestacaoApp')
        .factory('ListaFiltro', ListaFiltro);

    ListaFiltro.$inject = [];

    /* @ngInject */
    function ListaFiltro() {

        /* jshint shadow:true */
        function ListaFiltro() {
            this.itemsFiltro = [];
            this.currentItem = null;
        }

        ListaFiltro.prototype.addItem = function (itemFiltro) {
            let self = this;
            self.itemsFiltro.push(itemFiltro);
        };

        ListaFiltro.prototype.removeItem = function (itemFiltro) {
            let self = this;

            self.itemsFiltro = self.itemsFiltro.filter(function (item) {
                return item.order !== itemFiltro.order;
            });
        };

        ListaFiltro.prototype.reorder = function () {
            let self = this;

            self.itemsFiltro.forEach(function (itemFiltro) {
                itemFiltro.order = itemFiltro.htmlNode.index();
            });

            self.itemsFiltro.sort(function (a, b) {
                return (a.order > b.order ? 1 : -1);
            });
        };

        ListaFiltro.prototype.find = function (uiItem) {
            let self = this;

            return self.itemsFiltro.filter(function (itemFiltro) {
                return itemFiltro.name === uiItem;
            })[0];
        };

        ListaFiltro.prototype.clear = function () {
            let self = this;

            self.itemsFiltro = [];
        };

        ListaFiltro.prototype.setItemsStatus = function () {
            let self = this;
            let lastValidItem;

            self.itemsFiltro.forEach(function (item) {
                let prevItem = item.getPrevious(self);

                if (prevItem && !prevItem.isValid()) {
                    item.clear();
                    item.activated = false;
                    $(item.htmlNode).removeClass('ativado');
                    return;
                }

                item.activated = true;
                $(item.htmlNode).addClass('ativado');
                lastValidItem = item;
            });

            self.setCurrentItem(lastValidItem);
        };

        ListaFiltro.prototype.setCurrentItem = function (itemFiltro) {
            let self = this;

            if (itemFiltro) {
                self.currentItem = itemFiltro;
            } else {
                self.currentItem = null;
                return;
            }

            self.itemsFiltro.forEach(function (item) {
                $(item.htmlNode).removeClass('selecionado');
            });

            $(self.currentItem.htmlNode).addClass('selecionado');
        };

        ListaFiltro.prototype.validateNextItem = function () {
            let self = this;

            self.itemsFiltro.forEach(function (item) {
                let prevItem = item.getPrevious(self);

                if (prevItem && !prevItem.isValid()) {
                    item.clear();
                    item.activated = false;
                    $(item.htmlNode).removeClass('ativado');
                    return;
                }

                item.activated = true;
                $(item.htmlNode).addClass('ativado');
            });
        };

        return ListaFiltro;
    }

})();

