(function () {
    global.dashModule
        .service('shopCartService', ['$http', 'utilsService', shopCartService])
        .controller('shopCartIconCtrl', ['$scope', 'shopCartService', shopCartIconCtrl]);

    function shopCartService($http, utilsService) {
        let shopCartItems = 0;
        let isTermsAndConditionsChecked = false;
        const calbackFunctions = [];

        return {
            updateShopCartCount,
            registerCallbackFunction,
            setTermsCheckboxValues,
            getTermsCheckboxValue,
            sumPrice
        };

        function updateShopCartCount() {

            $http({
                method: 'POST',
                url: 'shop/api/getShopCartCount'
            }).then((response) => {
                if (response.data && response.data.newShopCartItemsCount) {
                    shopCartItems = response.data.newShopCartItemsCount;
                } else {
                    shopCartItems = 0;
                }

                calbackFunctions.forEach((calbackFunction) => {
                    calbackFunction(shopCartItems);
                });
            });
        }

        function registerCallbackFunction(newFunction) {
            calbackFunctions.push(newFunction);
        }

        function setTermsCheckboxValues(isTermsChecked) {
            isTermsAndConditionsChecked = isTermsChecked;
            utilsService.executeRegisteredFunction('isActionBtnDisabled', !isTermsChecked);
        }

        function getTermsCheckboxValue() {
            return isTermsAndConditionsChecked;
        }

        function sumPrice(values, quantity) {
            let total = 0;
            values.forEach((val) => {
                total += parseFloat(val);
            });

            return quantity ? total * quantity : 0;
        }
    }

    function shopCartIconCtrl($scope, shopCartService) {
        $scope.shopCartItemsCount = shopCartService.shopCartItems;
        $scope.hasPackagesInCart = hasPackagesInCart;
        shopCartService.registerCallbackFunction(updateCartValue);
        shopCartService.updateShopCartCount();

        function updateCartValue(newCartValue) {
            $scope.shopCartItemsCount = newCartValue;
        }

        function hasPackagesInCart() {
            return $scope.shopCartItemsCount > 0;
        }
    }
})();
