angular.module('productsMainModule')

.service('cartService', ['$http', '$q', function ($http, $q) {
    return {
        getItems: getItems,
        getAddresses: getAddresses,
        getBranches: getBranches,
        getContacts: getContacts,
        getTotal: getTotal,
        updateProductQuantity: updateProductQuantity,
        removeProduct: removeProduct,
        removeAllProducts: removeAllProducts,
        removeAllImported: removeAllImported,
        submitOrder: submitOrder
    };

    function getItems() {
        var q = $q.defer();

        $http.get('/baskets/cart/items').then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function getAddresses() {
        var q = $q.defer();

        $http.get('/baskets/cart/addresses').then(function(res) {
            q.resolve(res.data
                .map(function (x) {
                    if (!x.Basket) {
                        return;
                    }
                    var line_2 = [
                        x.Basket.suburb,
                        x.Basket.state,
                        x.Basket.postal_code
                    ]
                    .filter(function (s) { return !!s; })
                    .join(' ');
                    var description = [
                        x.Basket.delivery_address_line_1,
                        x.Basket.delivery_address_line_3,
                        line_2,
                    ]
                    .filter(function (s) { return !!s; })
                    .join(', ');
                    return {
                        id: x.Basket.id,
                        line_1: x.Basket.delivery_address_line_1,
                        line_2: line_2,
                        line_3: x.Basket.delivery_address_line_3,
                        line_4: x.Basket.delivery_address_line_4,
                        line_5: x.Basket.delivery_address_line_5,
                        suburb: x.Basket.suburb,
                        state: x.Basket.state,
                        postal_code: x.Basket.postal_code,
                        description: description
                    };
                })
                .filter(function (x) { return !!x; })
            );
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function getBranches() {
        var q = $q.defer();

        $http.get('/baskets/cart/branches').then(function(res) {
            q.resolve(parseBranches(res.data));
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function parseBranches(obj) {
        var arr = [];
        for (var i = 0; i < obj.length; i++) {
            for (var j = 0; j < obj[i][1].length; j++) {
                arr.push({
                    value: obj[i][1][j][0],
                    key: obj[i][1][j][1],
                    group: obj[i][0]
                });
            }
        }
        return arr;
    }

    function getContacts() {
        var q = $q.defer();

        $http.get('/baskets/cart/contacts').then(function(res) {
            q.resolve(res.data);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function getTotal() {
        var q = $q.defer();

        $http.get('/baskets/cart/total').then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function updateProductQuantity(product_id, qty, imported) {
        var q = $q.defer();


        $http.put('/baskets/cart/', { product_id: product_id, qty: qty, imported: imported }).then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function submitOrder(data) {
        var q = $q.defer();

        $http.post('/baskets/order', data).then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function removeProduct(product_id) {
        var q = $q.defer();

        $http.delete('/baskets/cart/delete', { data: { product_id: product_id } }).then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function removeAllProducts() {
        var q = $q.defer();

        $http.delete('/baskets/cart/delete').then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

    function removeAllImported() {
        var q = $q.defer();

        $http.delete('/baskets/import/delete').then(function(res) {
            q.resolve(res);
        }, function(err) {
            q.reject(err);
        });

        return q.promise;
    }

}]);