angular.module('sharedModule')

.service('productsWelsDatasource', ['$q', '$rootScope', 'productsMainService', function ($q, $rootScope, productsMainService) {
    
    var state = {
        status: 'notInitialized',
        wels: [],
        welsChecked: [],
    };

    return {
        status: function() { return state.status; },
        wels: function() { return state.wels; },
        welsChecked: function() { return state.welsChecked; },
        getBySearchString: getBySearchString,
        toggleChecked: toggleChecked,
        isChecked: isChecked,
        setCheckedItems: setCheckedItems,
        clearCheckedItems: clearCheckedItems,
    };

    function toggleChecked(wel) {
        if (typeof wel === 'string') {
            wel = { jde_wels_rating: wel };
        }
        if (isChecked(wel)) {
            uncheck(wel);
        } else {
            check(wel);
        }
    }

    function check(wel) {
        var found = state.wels.find(function (b) { return b.jde_wels_rating === wel.jde_wels_rating; });
        if (!found) {
            return;
        }
        var checked = state.welsChecked.find(function (b) { return b === found.jde_wels_rating; });
        if (checked) {
            return;
        }
        state.welsChecked.push(found.jde_wels_rating);
        broadcastWelsChecked();
    }

    function uncheck(wel) {
        var found = state.wels.find(function (b) { return b.jde_wels_rating === wel.jde_wels_rating; });
        if (!found) {
            return;
        }
        state.welsChecked = state.welsChecked.filter(function (b) { return b !== found.jde_wels_rating; });
        broadcastWelsChecked();
    }

    function isChecked(wel) {
        return state.welsChecked.find(function (b) { return b == wel.jde_wels_rating; })
    }

    function setCheckedItems(str) {
        state.welsChecked = str.split(';');
    }

    function clearCheckedItems() {
        state.welsChecked = [];
    }

    function getBySearchString(search_string, search_type, items_checked) {
        if (typeof items_checked === 'undefined') items_checked = state.welsChecked;

        var q = $q.defer();
        
        productsMainService.wels(search_string, search_type)
        .then(function(wels) {
            
            state.wels = wels;
            if (items_checked && items_checked.length) {
                state.welsChecked = items_checked.filter(function (i) { return wels.find(function (b) { return b.jde_wels_rating === i; }); });
            }
            state.status = 'ready';

            q.resolve(wels);

        }, function(err) {
            state.status = 'failed';
            q.reject(err);
        });

        return q.promise;
    }

    function broadcastWelsChecked() {
        $rootScope.$broadcast('productWelsDatasource.welsChecked', state.welsChecked.join(';'));
    }

}]);