(function () {
    "use strict";

    angular.module('pos').controller('consultaController', controller);
    controller.$inject = ['$scope', '$state','$window', '$q', '$timeout', 'produtoService', '$filter', 'configService'];

    function controller($scope, $state, $window, $q, $timeout, produtoService, $filter, configService) {
        $scope.$parent.initializeLayout('Consulta de Preços e Estoque');

        $scope.state = {
            data: {
                Barra: {},
                Preco: 0,
                PrecoLiquido: 0,
                ValorDesconto: 0,
                Desconto: 0,
                OperacaoVenda: '',
                TabelaPreco: '',
                Disponivel: 0
            },
            consulta: {},
            currentItem: false,
            filtro: '',
            carregando: false,
            totalizado: false,
            detalhes: true,
            vazio: false,
            bipado: false,
            itens: [],
            estoque: [],
            tabelasPrecos: [],
            modalEndereco: false,
            tabelaPrecoSelecionada: {}
        };

        $scope.initialize = function () {
            refreshList(false, true);
            $scope.refreshState();
            getTabelasPreco();
            //$scope.state.totalizado = $scope.state.itens.length > 0;

            $('[ng-model$="state.filtro"]').focus();
        };
        $scope.historyBack = function () {
            //$window.history.back();
        }



        
        $scope.adicionaritempedido = function () {
            
            localStorage.setItem("itensConsulta", JSON.stringify($scope.state.itens));

            setTimeout(function () { 
                $state.go('state-venda-add'); 
            });

        }


        $scope.get = function () {
            if ($scope.state.filtro == "") return;

            $scope.state.carregando = true;
            $scope.state.vazio = false;
            $scope.state.currentItem = false; 
            $scope.state.consulta.lst = [];

            var tabelaPreco = '';
            var produto = $scope.state.filtro;

            if ($scope.state.tabelaPrecoSelecionada != null &&
                $scope.state.tabelaPrecoSelecionada.Codigo != undefined)
                tabelaPreco = $scope.state.tabelaPrecoSelecionada.Codigo;
            else
                tabelaPreco = $scope.$parent.config.OperacaoVenda.TabelaPadrao.Codigo;

            produtoService
                //.getConsulta($scope.state.filtro)
                .getConsultaByTabelaPreco(produto, tabelaPreco)
                .then(
                function (response) { 

                    $scope.state.filtro = '';
                    if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                    else {

                        var isarray = Array.isArray(response.Data); 
                        if (isarray) {
                            $scope.state.currentItem = true;
                            angular.copy(angular.fromJson(response.Data), $scope.state.consulta.lst);

                        } else {

                            angular.copy(angular.fromJson(response.Data), $scope.state.data);

                            var filtro = $scope.state.filtro.trimRight();
                            var refProd = $scope.state.data.Barra.Codigo.trimRight();

                            //$scope.state.data.Ref = (filtro.toLowerCase() != refProd.toLowerCase())

                            //if ($scope.state.data.Ref) {
                            //    //var variation = hasVariation();
                            //    $scope.state.currentItem = ($scope.state.currentItem == -1 ? 1 : -1);
                            //    getPrecoCores();
                            //    $scope.state.carregando = false;
                            //    return;
                            //}

                            $scope.state.data.Ref = false;

                            if (!$scope.state.totalizado && !$scope.state.detalhes)
                                $scope.state.detalhes = true;

                            addItem($scope.state.data);
                            getEstoques();
                            $timeout(function () { $scope.getDataChartVendasAno(); });


                        }
                       }
                    $scope.state.carregando = false;
                    $scope.state.vazio = $.isEmptyObject(response.Data);
                    $scope.state.bipado = true;
                    $scope.state.produto = $scope.state.filtro;
                    $scope.state.filtro = '';

                    $('[ng-model$="state.filtro"]').focus();
                },
                function (err) {
                    $scope.$parent.toastr.error(err);
                    $scope.state.carregando = false;
                    $scope.state.vazio = true;
                }
                );
        };

        $scope.hasProduct = function (item) {
            return item.Quantidade < 0;
        };

        $scope.addAllItems = function () {
            var products = [];
            for (var i = 0; i < $scope.state.data.Barra.Produto.Estoques.length; i++) {
                products = generateObjects($scope.state.data.Barra.Produto.Estoques[i], products);
            }

            getAllItems(products);
        };

        $scope.GetClass = function (size, color, itemProduto) {
            if ($scope.$parent.config.ExibeEstoqueCor || ($parent.config.ExibeQtdeEstoqueVenda && $scope.$parent.config.ExibeEstoqueCor)) {
                var result = $scope.getNewQuantidadeCorTamanho(size, color, itemProduto);
                if (result > 0)
                    return 'radio-green';
                else
                    return 'radio-red';
            }
        }

        var getAllItems = function (itens) {
            produtoService
                .getAllItemsConsulta(itens)
                .then(
                function (response) {
                    if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                    else {
                        $scope.state.itens = $scope.state.itens.concat(response.Data);
                    }
                    $scope.state.carregando = false;
                    $scope.state.vazio = $.isEmptyObject(response.Data);
                    $scope.state.bipado = true;
                    $scope.state.filtro = '';
                    $scope.state.produto = $scope.state.filtro;

                    $('[ng-model$="state.filtro"]').focus();
                },
                function (err) {
                    $scope.$parent.toastr.error(err);
                    $scope.state.carregando = false;
                    $scope.state.vazio = true;
                }
                );
        };

        var generateObjects = function (array, products) {
            for (var i = 0; i < array.EstoqueTamanhos.length; i++) {
                if (array.EstoqueTamanhos[i].Qnt && Number(array.EstoqueTamanhos[i].Qnt) > 0) {
                    products.push({
                        Barra: {
                            Produto: { Codigo: $scope.state.filtro },
                            CorProduto: { Codigo: array.CorProduto },
                            Tamanho: {
                                Posicao: Number(array.EstoqueTamanhos[i].Tamanho.Posicao),
                            }
                        },
                        Quantidade: array.EstoqueTamanhos[i].Qnt,
                    });
                }
            }
            return products;
        }

        $scope.getNewQuantidadeCorTamanho = function (size, color, itemProduto) {
            if (itemProduto == null) {
                if (!size || size == "" || !color || color == "")
                    return 0;
                for (var i = 0; i < $scope.consulta.data.Barra.Produto.Estoques.length; i++) {
                    var item = $scope.consulta.data.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTamanho(item.EstoqueTamanhos, size);
                }
            }
            else {
                if (!size || size == "" || !color || color == "")
                    return 0;
                for (var i = 0; i < itemProduto.Barra.Produto.Estoques.length; i++) {
                    var item = itemProduto.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTamanho(item.EstoqueTamanhos, size, itemProduto);
                }
            }
            return 0;
        }


        $scope.getQuantidadeCorTamanho = function (item, itemProduto) {

            console.log(itemProduto)
            console.log(item)
            return 0;
            if (itemProduto == null) {
                if (!size || size == "" || !color || color == "")
                    return 0;
                for (var i = 0; i < $scope.auxiliar.consulta.data.Barra.Produto.Estoques.length; i++) {
                    var item = $scope.auxiliar.consulta.data.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTamanho(item.EstoqueTamanhos, size);
                }
            }
            else {
                if (!size || size == "" || !color || color == "")
                    return 0;
                for (var i = 0; i < itemProduto.Barra.Produto.Estoques.length; i++) {
                    var item = itemProduto.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTamanho(item.EstoqueTamanhos, size, itemProduto);
                }
            }
            return 0;







            //if (!size || size == "" || !color || color == "")
            //    return 0;
            //for (var i = 0; i < $scope.state.data.Barra.Produto.Estoques.length; i++) {
            //    var item = $scope.state.data.Barra.Produto.Estoques[i];
            //    if (item.CorProduto == color)
            //        return getQuantidadeTamanho(item.EstoqueTamanhos, size);
            //}
            //return 0;
        }

        var getQuantidadeTamanho = function (array, size) {
            for (var i = 0; i < array.length; i++)
                if (array[i].Tamanho.Posicao == size)
                    return array[i].Quantidade;
        }

        $scope.getnewQuantidadeCor = function (color, itemProduto) {
            if (itemProduto == null) {
                if (!color || color == "")
                    return 0;
                for (var i = 0; i < $scope.consulta.data.Barra.Produto.Estoques.length; i++) {
                    var item = $scope.consulta.data.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTodosTamanho(item.EstoqueTamanhos);
                }
            }
            else {
                if (!color || color == "")
                    return 0;
                for (var i = 0; i < itemProduto.Barra.Produto.Estoques.length; i++) {
                    var item = itemProduto.Barra.Produto.Estoques[i];
                    if (item.CorProduto == color)
                        return getQuantidadeTodosTamanho(item.EstoqueTamanhos);
                }
            }
            return 0;
        }


        $scope.getQuantidadeCor = function (color) {
            if (!color || color == "")
                return 0;
            for (var i = 0; i < $scope.state.data.Barra.Produto.Estoques.length; i++) {
                var item = $scope.state.data.Barra.Produto.Estoques[i];
                if (item.CorProduto == color)
                    return getQuantidadeTodosTamanho(item.EstoqueTamanhos);
            }
            return 0;
        }
        var getQuantidadeTodosTamanho = function (array) {
            var total = 0;
            if (array == null)
                array = [];
            for (var i = 0; i < array.length; i++)
                total += array[i].Quantidade;
            return total;
        }

        $scope.showEstoque = function (item) {
            var hasEstoque = 0;

            for (var i = 0; i < item.EstoqueTamanhos.length; i++)
                hasEstoque += (item.EstoqueTamanhos[i].Quantidade < 0 ? 1 : 0);

            return hasEstoque;
        };

        $scope.getBarra = function (tamanho, cor, referencia) {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            var tabelaPreco = ''; 
            if ($scope.state.tabelaPrecoSelecionada != null &&
                $scope.state.tabelaPrecoSelecionada.Codigo != undefined)
                tabelaPreco = $scope.state.tabelaPrecoSelecionada.Codigo;
            else
                tabelaPreco = $scope.$parent.config.OperacaoVenda.TabelaPadrao.Codigo;

            produtoService
                //.getCodigosBarras(tamanho, cor, referencia)
                .getCodigosBarrasByTabelaPreco(tamanho, cor, referencia, tabelaPreco)
                .then(
                function (response) {
                    if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                    else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.data);
                        addItem($scope.state.data);
                        $scope.state.data.Ref = ($scope.state.filtro != $scope.state.data.Barra.Codigo)
                        getEstoques();
                        $scope.state.currentItem = false;
                        $scope.state.filtro = '';
                        $timeout(function () { $scope.getDataChartVendasAno(); });
                    }
                    $scope.state.carregando = false;
                    $scope.state.vazio = $.isEmptyObject(response.Data);
                    $scope.state.bipado = true;

                    $('[ng-model$="state.filtro"]').focus();
                },
                function (err) {
                    $scope.$parent.toastr.error(err);
                    $scope.state.carregando = false;
                    $scope.state.vazio = true;
                }
                );
        }
        $scope.getDataChartVendasAno = function () {
            produtoService
                .getDataChartVendasAno($scope.state.data.Barra.Produto.Codigo)
                .then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        $scope.$parent.tools.buildChart('#vendas-ano-chart', 'Quantidades', response.Data);
                    }
                },
                function (err) { $scope.$parent.toastr.error(err); }
                );
        };

        $scope.totalizar = function () {
            //$scope.state.totalizado = ($scope.state.totalizado ? false : true);
        };

        $scope.limpar = function () {
            refreshList();
            $scope.state.itens.length = 0;
            $scope.state.bipado = false
            refreshList(true);
        };

        $scope.getCor = function (codigo) {
            var color = $.grep($scope.state.data.Barra.Produto.CoresProdutos, function (i) {
                return i.Codigo === codigo;
            });
            return (color && color.length > 0 ? color[0].Nome : "");
        }

        //var hasVariation = function () {
        //    var cont = 0;

        //    for (var i = 0; i < $scope.state.data.Barra.Produto.Estoques.length; i++)
        //        cont += ($scope.state.data.Barra.Produto.Estoques[i].Quantidade < 0 ? 1 : 0);

        //    if (cont == 0) {
        //        $scope.$parent.toastr.error("Produto Esgotado");
        //        $scope.state.vazio = true;
        //        $scope.state.carregando = false;
        //        $scope.state.bipado = true;
        //    }
        //    return cont;

        //}

        var getEstoques = function () {
            var array = [];
            for (var i = 0; i < $scope.state.data.Barra.Produto.Estoques.length; i++) {
                array = getTamanhos($scope.state.data.Barra.Produto.Estoques[i], array);
            }
            $scope.state.estoques = array;
        }

        var getPrecoCores = function () {
            var precoCores = [];
            var codigoProduto = $scope.state.data.Barra.Produto.Codigo;
            var tabelaPreco = '';

            if ($scope.state.tabelaPrecoSelecionada != null &&
                $scope.state.tabelaPrecoSelecionada.Codigo != undefined)
                tabelaPreco = $scope.state.tabelaPrecoSelecionada.Codigo;
            else
                tabelaPreco = $scope.$parent.config.OperacaoVenda.TabelaPadrao.Codigo;

            produtoService
                //.getPrecoCores($scope.state.data.Barra.Produto.Codigo)
                .getPrecoCoresByTabelaPreco(codigoProduto, tabelaPreco)
                .then(
                function (response) {
                    if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                    else {
                        precoCores = response.Data;
                        $scope.state.precoCores = precoCores;
                    }
                },
                function (err) { $scope.$parent.toastr.error(err); }
                );
        }


        $scope.getNewProdutoPreco = function (data) {

              
            if (!data.PrecoPorCor) {
                return data.PrecoLiquido;
            }
            else {

                return data.PrecoPorCor;

            }
        }


        $scope.getProdutoPreco = function (cor, itemProduto) {
            if (itemProduto == null) {
                if (!$scope.auxiliar.consulta.data.Barra.Produto.PrecoPorCor) {
                    return $scope.auxiliar.consulta.data.PrecoLiquido;
                }
                else {
                    if ($scope.auxiliar.consulta.precoCores == undefined)
                        return 0;
                    else {
                        var preco = $scope.auxiliar.consulta.precoCores[cor];
                        return preco;
                    }
                }
            }

        }

        $scope.getProdutoPreco = function (cor) {
            if (!$scope.state.data.Barra.Produto.PrecoPorCor) {
                return $scope.state.data.PrecoLiquido;
            }
            else {
                if ($scope.state.precoCores == undefined)
                    return 0;
                else {
                    var preco = $scope.state.precoCores[cor];
                    return preco;
                }
            }
        }

        var getTamanhos = function (estoques, array) {
            for (var i = 0; i < estoques.EstoqueTamanhos.length; i++) {
                if (array.indexOf(estoques.EstoqueTamanhos[i].Tamanho.Nome.trim()) == -1 && estoques.EstoqueTamanhos[i].Quantidade < 0)
                    array.push(estoques.EstoqueTamanhos[i].Tamanho.Nome.trim());
            }
            return array;
        }

        var addItem = function (data) {
            refreshList();

            var item = {};

            angular.copy(data, item);
            item.Quantidade = 1;

            var hasItem = isNew(data);

            if (typeof hasItem != "number")
                $scope.state.itens.push(item);
            else
                $scope.state.itens[hasItem].Quantidade += 1;

            refreshList();
        }

        $scope.deleteItem = function (index) {
            $scope.state.itens.splice(index, 1);
            refreshList(true);
        }

        var refreshList = function (actionDelete, init) {
            var now = new Date().getTime();
            var lista = [];

            if (localStorage.listaConsulta)
                var lista = JSON.parse(localStorage.listaConsulta);

            if (Number(localStorage.listaConsultaExpira) > now && $scope.$parent.environment.perfil.Codigo == localStorage.listaConsultaUsuario) {
                if ($scope.state.itens.length == 0 && lista.length > 0 && !actionDelete)
                    $scope.state.itens = lista;
            }
            else if (init) {
                $scope.state.itens = [];
                localStorage.setItem("state", "");
            }



            setStorage();
        }

        var setStorage = function () {
            localStorage.setItem("listaConsultaUsuario", $scope.$parent.environment.perfil.Codigo);
            localStorage.setItem("listaConsulta", JSON.stringify($scope.state.itens));
            localStorage.setItem("listaConsultaExpira", setDateExpire(1));
        }

        var isNew = function (data) {
            if ($scope.state.itens.length == 0)
                return false;

            var hasProduct = $.grep($scope.state.itens, function (i) {
                var hasItem = (i.Barra.Codigo === data.Barra.Codigo) &&
                    (i.TabelaPreco === data.TabelaPreco);

                return hasItem;
            })

            return (!hasProduct || hasProduct.length == 0 ? false : $scope.state.itens.indexOf(hasProduct[0]))
        }

        var getTabelasPreco = function () {
            configService.getAllTabelasPreco()
                .then(
                function (response) {
                    if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                    else {
                        angular.copy(response.Data, $scope.state.tabelasPrecos);

                        var codOpTab = $scope.state.tabelasPrecos.filter(function (tabelaPreco) {
                            if (tabelaPreco.Codigo == $scope.$parent.config.OperacaoVenda.TabelaPadrao.Codigo)
                                return tabelaPreco;
                        });

                        $scope.state.tabelaPrecoSelecionada = codOpTab[0];
                    }
                },
                function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.getTotal = function (index) {
            var sum = 0;
            for (var i = 0; i < $scope.state.itens.length; i++) {
                sum += $scope.state.itens[i].Quantidade * $scope.state.itens[i].Preco;
            }
            return sum.toFixed(2);
        }

        $scope.getTotalLiquido = function (index) {
            var sum = 0;
            for (var i = 0; i < $scope.state.itens.length; i++) {
                sum += $scope.state.itens[i].Quantidade * $scope.state.itens[i].PrecoLiquido;
            }
            return sum.toFixed(2);
        }

        $scope.checkQnt = function (index) {
            var item = $scope.state.itens[index];
            if (typeof item.Quantidade != "number" || item.Quantidade < 1)
                item.Quantidade = 1
        }

        $scope.selectProduct = function (index) {
            angular.copy($scope.state.itens[index], $scope.state.data);
            $scope.state.bipado = true;
            $scope.state.detalhes = true;
            $scope.state.vazio = false;
        }

        $scope.modalClose = function () {
            $scope.state.currentItem = false;
            $scope.state.carregando = false;
        }

        $scope.refreshState = function (change) {
            if (localStorage.state && !change) {
                var state = JSON.parse(localStorage.state);
                $scope.state.totalizado = state.totalizado;
                $scope.state.detalhes = state.detalhes;
            }

            if (!$scope.state.totalizado && $scope.state.itens.length > 0 && !change)
                $scope.state.totalizado = true;

            localStorage.setItem("state", JSON.stringify($scope.state));
        }

        var setDateExpire = function (minutes) {
            var date = new Date(new Date().getTime() + minutes * 60000).getTime();
            return date
        }

        $scope.initialize();
    }

})();