(function () {
    "use strict";

    angular.module('pos').controller('entradaDetailController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', '$timeout', 'entradaService', 'entidadeAuxiliarService', 'produtoService', '$confirm', '$filter', 'notaFiscalService', 'vendedorService'];

    function controller($scope, $state, $stateParams, $window, $timeout, entradaService, entidadeAuxiliarService, produtoService, $confirm, $filter, notaFiscalService, vendedorService) {
        $scope.$parent.initializeLayout('Entrada');
        $scope.defaultNota = "/*------------------------------------------------------------------------------*Diferenças da entrada:*------------------------------------------------------------------------------*/";
        //[Inicializa objetos]
        $scope.state = {
            delete: false, 
            dataOrigem: {},
            calculando: false,
            FilialOrigem: {},
            NotaFiscal: {},
            Saida: {},
            Filial: {},
            TabelaPreco: {},
            Terceiro: {},
            TipoMovimentacao: {},
            data: { Codigo: decodeURIComponent($stateParams.codigo) },
            itensEntrada: {},
            carregando: false,
            vazio: false,
            notasAtivo: false,
            item: { ativo: false },
            filtroProduto: { codigo: '', ativo: false },
            ultimoProduto: {},
            tamanhoMaximo: 0,
        };
        $scope.auxiliar = {
            modalProduto: false,
            produto: {},
            tabelaPreco: { data: [] },
            tipoMovimentacao: { data: [] },
            especieSerie: { data: [] },
            serie: { data: [] },
            oldItens: [],
            vendedores: { data: [] }
        };
        $scope.orderedItens = [];

        //[Inicializa funcões]
        $scope.initialize = function () {
            $('input[ng-model*="state.filtroProduto.codigo"]').first().focus();
            $scope.refresh();
        };

        $scope.print = function () {

            var divToPrint = document.getElementById('print');
            var newWin = window.open('', 'Print-Window');

            newWin.document.open();
            newWin.document.write('<html><head>' + getStyle() + '</head><body onload="window.print()">' + divToPrint.innerHTML + '</body></html>');

            newWin.document.close();

            //setTimeout(function () {
            //    newWin.close();
            //}, 10);
        }

        var getStyle = function () {
            return "<link href='/content/css/bootstrap.paper.min.css' rel='stylesheet' type='text/css'> " +
                "<link href='/content/css/bootstrap.grid.custom.min.css' rel='stylesheet'> " +
                "<link href='/content/css/font-awesome.min.css' rel='stylesheet' type='text/css'> " +
                "<link href='/content/css/animate.min.css' rel='stylesheet' type='text/css'> " +
                "<link href='/content/css/angular-toast.min.css' rel='stylesheet'> " +
                "<link href='/content/css/material-icons.css' rel='stylesheet'> " +
                "<link href='/content/css/site-lightblue.css' title='prefered' rel='stylesheet' type='text/css'> " +
                "<link href='/content/css/Dev.css' rel='stylesheet'> " +
                "<base href='/'> ";
        }


        $scope.hasDivergencia = function (notas, defaultValue) {
            if (!notas)
                return false;
            var valor = "/*------------------------------------------------------------------------------*" +
                "Diferenças da entrada:" +
                "*------------------------------------------------------------------------------*/";

            return notas.trim() != valor.trim();
        }
        $scope.historyBack = function () {
            $window.history.back();
        }

        $scope.getProduto = function (codigo) {
            $scope.auxiliar.modalProduto = true;
            produtoService
                .get(codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.auxiliar.produto = response.Data;
                            produtoService.
                                getEstoqueProduto(codigo).then(
                                    function (responseEstoque) {
                                        if (responseEstoque.Status < 0)
                                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                                        else
                                            $scope.auxiliar.estoque = responseEstoque.Data;
                                    },
                                    function (err) { $scope.$parent.toastr.error(err); });
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };

        $scope.get = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            entradaService
                .get($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.state.data = response.Data;
                            if ($state.is('state-entrada-edit'))
                                $scope.state.original = response.Data;
                            $scope.getTamanhoMaximo();
                            $scope.orderedItens = $filter('orderBy')($scope.state.data.Itens, 'Grade', true)
                        }
                        $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.save = function () {
            entradaService
                .save($scope.state.data)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Gravação da entrada");
                        else {
                            $scope.state.data = response.Data;
                            $scope.historyBack();
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Comunicação com o servidor"); }
                );
        };


        var printRomaneio = function (returnPage) {
            $confirm({
                text: "Deseja imprimir o romaneio?"
            }).then(function () {
                $scope.print();
                if (returnPage)
                    $scope.historyBack();
            });
        }

        $scope.setCancelada = function () {
            $scope.$parent.toastr.info('Cancelando nota de entrada...');
            entradaService
                .setCancelada($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Cancelando NF de entrada');
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.info("NF de entrada cancelada.");
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        };
        $scope.setConferida = function () {
            if ($scope.state.data.Status != 0)
                return false;

            entradaService
                .setConferida($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Conferência NF de entrada');
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.info("NF de entrada conferida.");
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };
        $scope.setEncerrada = function () {
            if ($scope.state.data.Status != 0 && $scope.state.data.Status != 3)
                return false;

            entradaService
                .setEncerrada($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Encerramento NF de entrada');
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.info("NF de entrada encerrada.");
                            printRomaneio();
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };

        $scope.hasChanges = function () {
            return !angular.equals($scope.state.data, $scope.state.original);
        };
        $scope.discardChanges = function () {
            angular.copy($scope.state.original, $scope.state.data);
            $scope.changeStyles();
        };

        $scope.getAllTabelaPreco = function () {
            entidadeAuxiliarService
                .getAllTabelaPreco()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Carregando tabelas de preços');
                        else
                            angular.copy(response.Data, $scope.auxiliar.tabelaPreco.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };
        $scope.getAllTipoMovimentacao = function () {
            entidadeAuxiliarService
                .getAllTipoMovimentacaoEntrada()
                .then(
                    function (response) {
                        debugger;
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Carregando tipos de movimentação');
                        else {

                            angular.copy(response.Data, $scope.auxiliar.tipoMovimentacao.data);
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };
        $scope.getAllEspecieSerie = function () {
            entidadeAuxiliarService
                .getAllEspecieSerie()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.especieSerie.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }
        $scope.getAllSerie = function () {
            entidadeAuxiliarService
                .getAllSerie()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.serie.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }

        $scope.refresh = function () {
            $scope.get();
            $scope.getAllTabelaPreco();
            $scope.getAllTipoMovimentacao();
            $scope.getAllEspecieSerie();
            $scope.getAllSerie();
            $scope.getAllVendedores();
        };


        $scope.getTamanhoMaximo = function () {
            entidadeAuxiliarService.getTamanhoMaximo().then(function (data) {
                $scope.state.tamanhoMaximo = Math.ceil(Number(data.Data) / 20);
               // $scope.state.data
            }, function (data) {
                $scope.$parent.toastr.error(data.Message, 'Erro');
            });
        }

        $scope.prepareNewItem = function () {
            debugger;
            $scope.state.dataOrigem = $scope.state.data;
            $scope.state.calculando = true;
            entradaService
                //.prepareNewItem($scope.state.data, $scope.state.filtroProduto.codigo)
                .prepareNewItem(null, $scope.state.filtroProduto.codigo)
                .then(
                    function (response) {
                        debugger;
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Preparando item de entrada');
                            $scope.state.calculando = false;
                        }
                        else {
                            $scope.auxiliar.oldItens = ($scope.state.data.Itens ? $scope.state.data.Itens : []);
                            $scope.state.ultimoProduto = response.Data.Produto;
                            $scope.state.data = $scope.state.dataOrigem;
                            $scope.state.data.Valor = response.Data.Valor;
                            $scope.state.data.Quantidade = response.Data.Quantidade;
                            $scope.state.ItensRef = response.Data.ItensRef;
                            $scope.state.data = $scope.state.dataOrigem;
                            debugger;
                            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.trim() == response.Data.Produto.CodigosBarras[0].CorProduto.Codigo.trim());
                                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));
                                $scope.state.data.Itens = $scope.state.data.Itens.concat($scope.state.ItensRef.filter((item) => $scope.state.data.Itens.indexOf(item) < 0));
                            }

                            if (indexO >= 0) {
                                $scope.state.data.Itens.splice(indexO, 1);
                            }


                            if (response.Data.Item.CorProduto != null && response.Data.Item.Quantidade > 0)
                                $scope.state.data.Itens.push(response.Data.Item);


                            if ($scope.$parent.config.GradeEntradaSaida || !$scope.state.ultimoProduto.CodigosBarras[0])
                                $scope.toggleItem();
                            //else
                            //    automaticSendProduct($scope.state.data, $scope.state.ultimoProduto.CodigosBarras[0].CorProduto.Codigo, $scope.state.ultimoProduto.CodigosBarras[0]);
                            $scope.state.calculando = false;
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
            $scope.state.filtroProduto.codigo = "";
        };
        $scope.calculate = function (item) {
            debugger;
            $scope.state.carregando = true;
            angular.copy($scope.state.data, $scope.state.itensEntrada);
            if (item == null) {
                if ($scope.state.ultimoProduto != null && $scope.state.ultimoProduto.Codigo != null && !$scope.state.delete)
                    $scope.state.itensEntrada.Itens = $scope.state.data.Itens.filter(a => a.Produto.Codigo == $scope.state.ultimoProduto.Codigo);
            }
            else {
                $scope.state.itensEntrada.Itens = $scope.state.data.Itens.filter(a => a.Produto.Codigo == item.Produto.Codigo);
            }
            $scope.state.calculando = true;
            entradaService
                .calculate( {Itens: $scope.state.itensEntrada.Itens})
                .then(
                    function (response) {
                        debugger;
                        if (response.Status < 0) {
                            $scope.state.carregando = false;
                            $scope.state.calculando = false;
                            $scope.state.delete = false;
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.error(response.Message, 'Recalculando entrada');
                        }
                        else {
                          
                            $scope.state.data = response.Data;
                          
                            $scope.state.calculando = false;
                            $scope.state.carregando = false;
                            $scope.state.delete = false;
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
            //}
        };

        $scope.toggleNotas = function () {
            $scope.state.notasAtivo = !$scope.state.notasAtivo;
        };
        $scope.toggleItem = function () {
            $scope.state.item.ativo = !$scope.state.item.ativo;
            if (!$scope.state.item.ativo) {
                $scope.state.filtroProduto.codigo = '';
                if (!$scope.state.ultimoProduto.CodigosBarras[0])
                    $('input[ng-model*="state.filtroProduto.codigo"]').first().focus();
                else
                    $('#' + $scope.state.ultimoProduto.CodigosBarras[0].CorProduto.Codigo + "-" + $scope.state.ultimoProduto.CodigosBarras[0].Tamanho.Posicao).focus();
                $scope.calculate();
            }
            else
                $timeout(function () {
                    if (!$scope.state.ultimoProduto.CodigosBarras[0])
                        $('#add-item form.form input[ng-model*="tamanho.Quantidade"]').first().focus();
                    else
                        $('#' + $scope.state.ultimoProduto.CodigosBarras[0].CorProduto.Codigo + "-" + $scope.state.ultimoProduto.CodigosBarras[0].Tamanho.Posicao).focus();
                });
        };



        //$scope.deleteItem = function (index) {
        //    $scope.state.data.Itens[index].Tamanhos.filter(x => x.Quantidade = 0);
        //    $scope.calculate($scope.state.data.Itens[index]);
        //    //$scope.state.data.Itens.splice(index, 1);
        //    //$scope.calculate();
        //};
        $scope.deleteItem = function (indexO) {
            debugger;
            //var indexO = $scope.state.data.Itens.indexOf(item);

            if (indexO >= 0)
                $scope.state.data.Itens.splice(indexO, 1);

            $scope.state.delete = true;
            $scope.calculate();
        };

        $scope.removeItem = function (item) {
            debugger
           var tp = $scope.state.data.TipoMovimentacao;
            entradaService
                .removeItem(item)
                .then(
                    function (response) {
                        debugger;
                        if (response.Status < 0) {
                            $scope.state.carregando = false;
                            $scope.state.calculando = false;
                            $scope.$parent.toastr.error(response.Message, 'Deletando item entrada');
                        }
                        else {
                            $scope.state.data = response.Data;
                            $scope.state.data.TipoMovimentacao = tp;
                            $scope.state.calculando = false;
                            $scope.state.carregando = false;
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
            //}
        };

        $scope.submit = function () {
            debugger;
            if ($scope.state.filtroProduto.codigo)
                $scope.prepareNewItem();
            else
                $scope.save();
        };

        var automaticSendProduct = function (produto, cor, tamanho) {
            var hasItem = $.grep($scope.auxiliar.oldItens, function (element, index) {
                return element.CorProduto.Codigo == cor && element.Produto.Codigo == '';
            });

            var index = (hasItem.length > 0 ? 0 : $scope.auxiliar.oldItens.length);

            for (var i = index; i < produto.Itens.length; i++) {
                var item = produto.Itens[i];

                for (var cont = 0; cont < item.Tamanhos.length; cont++) {
                    $scope.setInitialValue($scope.state.ultimoProduto, item.CorProduto.Codigo, item.Tamanhos[cont]);
                }
            }
            //$scope.calculate();
            $scope.state.filtroProduto.codigo = "";
        }

        $scope.setInitialValue = function (produto, cor, tamanho) {
            if (!produto || !produto.CodigosBarras || produto.CodigosBarras.length == 0)
                return;

            var codigoBarra = produto.CodigosBarras[0];

            if (codigoBarra.CorProduto.Codigo == cor && codigoBarra.Tamanho.Posicao == tamanho.Tamanho.Posicao)
                tamanho.Quantidade += 1;
        }

        $scope.showHeader = function (index) {
            //if (index == null || $scope.orderedItens == null || $scope.orderedItens.length == 0)
            //    return true;
            if (!index || !$scope.orderedItens || !$scope.orderedItens[index - 1].Grade)
                return true;
            return (index == 0 || $scope.orderedItens[index - 1].Grade != $scope.orderedItens[index].Grade);
        }

        $scope.alteratipoMoovimentacao = function (tipoMovimentacao) {
            debugger;
            entradaService
                .alteratipoMoovimentacao(tipoMovimentacao)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            debugger;
                            $scope.state.data.TipoMovimentacao = response.Data.TipoMovimentacao;
                        }

                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
        }

        $scope.recalculaPrecos = function (codigoTabelaPreco) {
            entradaService
                .recalculaPrecos(codigoTabelaPreco.Codigo, null)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else {
                            //$scope.state.data.Itens = response.Data;
                            $scope.state.data = response.Data;
                            $scope.calculate(null);
                            $scope.$parent.toastr.info("Valores alterados!", "");
                        }

                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
        }

        $scope.getAllVendedores = function () {
            vendedorService
                .getAll()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Carregando vendedores');
                        else
                            angular.copy(response.Data, $scope.auxiliar.vendedores.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };

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

})();