(function () {
    "use strict";

    angular.module('pos').controller('inventarioDetailController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', 'inventarioService', '$timeout'];

    function controller($scope, $state, $stateParams, $window, inventarioService, $timeout) {
        $scope.$parent.initializeLayout('Inventário');
        
        //[Inicializa objetos]
        $scope.state = {
            dataOrigem: {},
            calculando: false,
            data: {
                Codigo: decodeURIComponent($stateParams.codigo),
                Filial: decodeURIComponent($stateParams.filial),
                produtos: [],
                movimentacoes: [],
            },
            carregando: false,
            vazio: false,
            initMovimentacoes: true,
            carregandoMovimentacoes: false,
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.refresh();
        };
        $scope.historyBack = function () {
            $window.history.back();
        }

        $scope.get = function () {
            debugger;
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            debugger;

            inventarioService
                .get($scope.state.data.Codigo, $scope.state.data.Filial)
                .then(
                    function (response) {
                        debugger;
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.state.data = response.Data;
                        }
                        
                        $scope.state.carregando = false;
                        $scope.state.vazio = (!response.Data);
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.carregando = false;
                        $scope.state.vazio = false;
                    }
                );
        };

        $scope.addItem = function (item) {

            inventarioService.addNewItem($scope.state.data.Filial, $scope.state.data.Codigo, item).then(function () {
            }, function () {
                console.log("erro");
            });
        }

        $scope.getItem = function (item) {
            debugger;
            $scope.state.calculando = true;
            $scope.state.dataOrigem = $scope.state.data; 
            //inventarioService.prepareNewItem($scope.state.data.Filial.Codigo, $scope.state.data, item).then(function (response) {
            inventarioService.prepareNewItem($scope.state.data.Filial.Codigo, null, item).then(function (response) {
                if (response.Status < 0) {
                    $scope.state.calculando = false;
                    $scope.$parent.toastr.error(response.Message, 'Serviço');
                    $timeout(function () {
                        $("#codigo-barras").focus();
                    });
                }
                else {
                   
                    debugger;
                    //$scope.state.data = response.Data;
                    $scope.state.data = $scope.state.dataOrigem;
                    $scope.state.ultimoProduto = response.Data.Produto;
                    $scope.state.data.Quantidade = response.Data.Quantidade;
                    $scope.state.ItensRef = response.Data.ItensRef;

                    if (response.Data.Produto != null && response.Data.Produto.CodigosBarras != undefined && response.Data.Produto.CodigosBarras.length > 0) {
                        var item = $scope.state.data.Itens.find(a => a.Produto.Codigo == response.Data.Produto.Codigo && a.CorProduto.Codigo == response.Data.Produto.CodigosBarras[0].CorProduto.Codigo);
                        var indexO = $scope.state.data.Itens.indexOf(item);
                    }
                    else {

                        var item = $scope.state.data.Itens.find(a => a.Produto.Codigo == response.Data.Produto.Codigo);
                        while (item) {
                            var indexOF = $scope.state.data.Itens.indexOf(item);
                            if (indexOF >= 0) {
                                $scope.state.data.Itens.splice(indexOF, 1);
                            }
                            item = $scope.state.data.Itens.find(a => a.Produto.Codigo == response.Data.Produto.Codigo);
                        }
                        $scope.itens = $scope.state.data.Itens.concat($scope.state.ItensRef.filter((item) => $scope.state.data.Itens.indexOf(item) < 0));
                        var newlist = [];
                        newlist = $scope.state.ItensRef.filter((item) => $scope.state.data.Itens.indexOf(item) < 0);
                     //   $scope.state.data.Itens;
                        $scope.state.data.Itens = newlist.concat($scope.state.data.Itens);
                    }

                    if (indexO >= 0)
                        $scope.state.data.Itens.splice(indexO, 1);
                   // && response.Data.Item.Quantidade > 0
                    if (response.Data.Item.CorProduto != null ){
                    $scope.state.data.Itens.unshift(response.Data.Item);
                    $scope.SetTotal();
                }
                    $timeout(function () {
                        $("#codigo-barras").focus();
                    });
                    //$scope.calculate($scope.state.data.Itens[$scope.state.data.Itens.length - 1]);
                    $scope.state.calculando = false;
                }
                $scope.state.filtroProduto.codigo = "";
            }, function (err) {
                $scope.$parent.toastr.error(err);
            });
        }

        $scope.finish = function (item) {
            $scope.state.data.ValidoFinalizado = true;
            inventarioService.save($scope.state.data).then(function (data) {
                $state.go("state-inventario-detail", { codigo: $stateParams.codigo, filial: $stateParams.filial })
                $scope.$parent.toastr.success('Inventário finalizado com sucesso');
                $scope.state.data = data.Data;
            }, function () {
                console.log("erro");
            });
        }
        $scope.cancel = function (item) {
            ;
            $scope.state.data.Cancelar = true;
            inventarioService.save($scope.state.data).then(function (data) {
                $state.go("state-inventario-detail", { codigo: $stateParams.codigo, filial: $stateParams.filial })
                $scope.$parent.toastr.success('Inventário cancelado com sucesso');
                $scope.state.data = data.Data;
            }, function () {
                console.log("erro");
            });
        }
        $scope.carregandoSave = false;
        $scope.save = function (item) {
            $scope.carregandoSave = true;
            inventarioService.save($scope.state.data).then(function (data) {
                $scope.carregandoSave = false;
                $scope.$parent.toastr.success('Inventário salvo com sucesso');
                $scope.state.data = data.Data;
                $state.go("state-inventario-detail", { codigo: $stateParams.codigo, filial: $stateParams.filial })
            }, function () {
                $scope.carregandoSave = false;
                console.log("erro");
            });
        }

        $scope.calculate = function (item) {
            $scope.state.calculando = true;
            item.Quantidade = 0;
            
            angular.forEach(item.Tamanhos, function (value, key) {                
                item.Quantidade += value.Quantidade;
            });
            $scope.state.data.Quantidade = 0;
            angular.forEach($scope.state.data.Itens, function (value, key) {
                $scope.state.data.Quantidade += value.Quantidade;
            });
            inventarioService.UpdateItemInventario(item).then(function (data) {
              
            }, function () {
                console.log("erro");
            });
            
            $scope.state.calculando = false;
        }
        $scope.SetTotal = function () {
            debugger;
            $scope.state.data.Quantidade = 0;
            angular.forEach($scope.state.data.Itens, function (value, key) {
                $scope.state.data.Quantidade += value.Quantidade;
            });
        }

        $scope.toggleModalMovimentacoes = function () {
            if ($scope.state.initMovimentacoes)
                $scope.getMovimentacoes();
            $scope.state.initMovimentacoes = false
            $scope.modalMovimentacoes = !$scope.modalMovimentacoes;
        }

        $scope.refresh = function () {
            //console.log($scope.state.data);
            $scope.get();
        };

        $scope.refreshAllData = function () {
            debugger;
            $scope.state.data.Filial = $scope.state.data.Filial.Codigo;
            $scope.get();
        };

        $scope.deleteItem = function (index) {
           
            debugger;
            var item = $scope.state.data.Itens[index];
     
           
            inventarioService.delete({ Produto: { Codigo: item.Produto.Codigo }, CorProduto: { Codigo: item.CorProduto.Codigo} }).then(function (data) {
                $scope.state.data.Itens.splice(index, 1);
                $scope.state.data.Quantidade = 0;
                angular.forEach($scope.state.data.Itens, function (value, key) {
                    $scope.state.data.Quantidade += value.Quantidade;
                });
                  }, function () {
                      console.log("erro");
                  });
        };

        $scope.getMovimentacoes = function () {
            $scope.state.carregandoMovimentacoes = true;
            inventarioService.getMovimentacoes($scope.state.data).then(function (data) {
                $scope.state.movimentacoes = data.Data
                $scope.selectedMovimentacoes = createMovimentacaoes(data.Data);
                $scope.state.carregandoMovimentacoes = false;
            }, function () {
                console.log("erro");
                $scope.state.carregandoMovimentacoes = false;
            })
        };

        var createMovimentacaoes = function (movimentacoes) {
            var unique = [];
            for (var i = 0; i < movimentacoes.length; i++) {
                var movimentacao = movimentacoes[i];

                if (unique.length == 0)
                    unique.push(movimentacao);

                if (!hasItem(unique, movimentacao.Codigo, movimentacao.Cor.Nome))
                    unique.push(movimentacao);

            }
            return unique;
        };

        var getItem = function (array, produto, cor, tipo) {
            var itens = $.grep(array, function (p) {
                return p.Codigo = produto && p.Cor.Nome == cor && p.Tipo == tipo;
            });
            return (itens.length > 0 ? true : false);
        }

        var hasItem = function (array, produto, cor) {
            var itens = $.grep(array, function (p) {
                return p.Codigo = produto && p.Cor.Nome == cor;
            });
            return (itens.length > 0 ? true : false);
        }


        $scope.checkSize = function (item) {
            return item.Tamanho.Nome != "";
        };

        $scope.getOperacoes = function (codigo, cor, tamanho, operacao) {
            if (!$scope.state.movimentacoes)
                return 0;

            var item = $.grep($scope.state.movimentacoes, function (p) {
                return p.Produto.Codigo == codigo && p.Cor.Nome == cor && p.Tipo == operacao;
            });
            if (!item || item.length == 0)
                return 0;
            var returnItem = $.grep(item[0].TamanhoInventario, function (p) {
                return p.Tamanho.Nome == tamanho;
            });

            if (!returnItem || returnItem.length == 0)
                return 0;

            return returnItem[0].Quantidade * (operacao == 'Troca' ? -1 : 1);
        };

        /*Inicializa funções*/
        $scope.initialize();
    }

})();