(function () {
    "use strict";

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

    function controller($scope, $state, $stateParams, $window, $timeout, $filter, $confirm , saidaService, entidadeAuxiliarService, entradaService, produtoService, configService, vendedorService) {
        $scope.$parent.initializeLayout('Saída');

        //[Inicializa objetos]
        $scope.state = {
            itensSaida: {},
            dataOrigem: {},
            calculando: false,
            data: { Codigo: decodeURIComponent($stateParams.codigo) },
            oldData: { Codigo: decodeURIComponent($stateParams.codigo) },
            editavel: false,
            carregando: false,
            vazio: false,
            notasAtivo: false,
            item: { ativo: false },
            filtroProduto: { codigo: '', ativo: false },
            ultimoProduto: {},
            tabCorrente: 0,
            tamanhoMaximo: 0,
            showModalSaida: false,
            tiposFrete: [
              { Tipo: 0, Descricao: "Por conta do emitente" },
              { Tipo: 1, Descricao: "Por conta do destinatário" },
              { Tipo: 2, Descricao: "Por conta de terceiros" },
              { Tipo: 9, Descricao: "Sem frete" }
            ],
        };
        $scope.auxiliar = {
            tabelaPreco: { data: [] },
            tipoMovimentacao: { data: [] },
            especieSerie: { data: [] },
            serie: { data: [] },
            produto: {},
            modaldanfe: false,
            modalxml: false,
            xml: '',
            estoque: 0,
            naturezaSelecionada: "",
            serieSelecionada: "",
            modalProduto: false,
            modalNota: false,
            naturezas: [],
            itemEntrada: {
                data: [],
                aux: [],
                ativo: false,
                filtro: { chaves: '', codigoTerceiro: '', codigoEntrada: '', skip: 0, take: 20 },
                count: 0,
                carregando: false,
                vazio: true,
                allSelected: false,
            },
            oldItens: [],
            vendedores: { data: [] },
            selected: []
        };
        $scope.addItemTamanho = function (tamanho) {
            debugger
            tamanho.Quantidade += 1;
            $scope.calculate();
        };
        //[Inicializa funcões]
        $scope.initialize = function () {
            $('input[ng-model*="state.filtroProduto.codigo"]').first().focus();
            $scope.refresh();
        };
        $scope.historyBack = function () {
            $window.history.back();
        }

        $scope.Bip = function ($event) {
            var keyCode = $event.which || $event.keyCode;
            if (keyCode === 13) {
                $scope.prepareNewItem();
            }
        }
        $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.PdfFileText = function () {
            return $scope.state.data.PDFFile;
            currentBlob = new Blob(text, { type: 'application/pdf' });
            return URL.createObjectURL(currentBlob);

        }
        $scope.formatXml = function (xml) {
            var formatted = '';
            var reg = /(>)(<)(\/*)/g;
            xml = xml.replace(reg, '$1\r\n$2$3');
            var pad = 0;
            jQuery.each(xml.split('\r\n'), function (index, node) {
                var indent = 0;
                if (node.match(/.+<\/\w[^>]*>$/)) {
                    indent = 0;
                } else if (node.match(/^<\/\w/)) {
                    if (pad != 0) {
                        pad -= 1;
                    }
                } else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
                    indent = 1;
                } else {
                    indent = 0;
                }

                var padding = '';
                for (var i = 0; i < pad; i++) {
                    padding += '  ';
                }

                formatted += padding + node + '\r\n';
                pad += indent;
            });

            return formatted;
        }
        $scope.DownLoadFileXml = function () {
            console.log("download");
            // var args = { nfnumero: $scope.state.data.NotaFiscal.Numero, serie: $scope.state.data.NotaFiscal.Serie.Codigo, filial: $scope.state.data.Filial.Nome };

            saidaService
              .GetXmlSefazDownload($scope.state.data.NotaFiscal.Numero, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.data.Filial.Nome).success(function (data, status, headers) {
                  headers = headers();

                  var filename = "Xml" + $scope.state.data.NotaFiscal.Numero;
                  var contentType = headers['content-type'];

                  var linkElement = document.createElement('a');
                  try {
                      //var blob = new Blob([data], { type: contentType });
                      var blob = new Blob([new Uint8Array([0xEF, 0xBB, 0xBF]), data.replace(/^\s+|\s+$/g, '')], { type: "text/xml;charset=UTF-8;" });

                      var url = window.URL.createObjectURL(blob);

                      linkElement.setAttribute('href', url);
                      linkElement.setAttribute("download", filename);

                      var clickEvent = new MouseEvent("click", {
                          "view": window,
                          "bubbles": true,
                          "cancelable": false
                      });
                      linkElement.dispatchEvent(clickEvent);
                  } catch (ex) {
                      console.log(ex);
                  }
              }).error(function (data) {
                  console.log(data);
              });

            //$scope.togglemodalxml();

            //saidaService
            //   .GetXmlSefazDownload($scope.state.data.NotaFiscal.Numero, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.data.Filial.Nome)
            //    .then(
            //        function (response) {
            //            if (response.Status < 0)
            //                $scope.$parent.toastr.error(response.Message, '');
            //            else {
            //                $scope.auxiliar.xml = response.Data;
            //            }
            //        },
            //        function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
            //    );

        }
        $scope.DownLoadXml = function () {
            $scope.togglemodalxml();

            saidaService
               .GetXmlSefaz($scope.state.data.NotaFiscal.Numero, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.data.Filial.Nome)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, '');
                        else {
                            $scope.auxiliar.xml = response.Data;
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );

        }

        $scope.get = function () {
            $scope.state.vazio = false;
            saidaService
                .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;
                            angular.copy(response.Data, $scope.state.oldData);
                            $scope.state.editavel = (response.Data.Status == 0);
                            if ($state.is('state-saida-edit'))
                                $scope.state.original = response.Data;
                            $scope.getTamanhoMaximo();
                            $scope.orderedItens = $filter('orderBy')($scope.state.data.Itens, 'Grade', true)
                        }
                        $scope.state.vazio = (!response.Data);
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.vazio = false;
                    }
                );
        };

        $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.save = function () {
            debugger;
            for (var i = 0; i < $scope.state.data.Itens.length; i++) {
                $scope.state.data.Itens[i].Saida.Itens = null;
            }
            saidaService
                .save($scope.state.data)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Gravação da saída");
                        else {
                            $scope.state.data = response.Data;
                            $state.go("state-saida-detail", { codigo: response.Data.Codigo }, { reload: false, location: 'replace' });
                            //$scope.historyBack();
                            $scope.$parent.toastr.success('Nota Fiscal de Saída');
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Comunicação com o servidor"); }
                );
        };

        $scope.insertSelected = function (Produto, Entrada) {
            if ($scope.auxiliar.selected.length != 0)
            {
                for(let i of $scope.auxiliar.selected) {
                    if (i.Produto == Produto && i.Entrada == Entrada) {
                        $scope.auxiliar.selected.pop({ Produto, Entrada});
                    } else {
                        $scope.auxiliar.selected.push({ Produto, Entrada });
                        break;
                    }
                };
            } else {
                $scope.auxiliar.selected.push({ Produto, Entrada });
            }
           
        };

        $scope.setCancelada = function () {
            $scope.$parent.toastr.info('Cancelando nota de saída...');
            saidaService
                .setCancelada($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Cancelando NF de saida');
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.clear();
                            $scope.get();
                            $scope.$parent.toastr.success("NF de saída cancelada.");
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        };

        $scope.setEncerrada = function () {
            $scope.carregandoModal = true;
            saidaService
                .setEncerrada($scope.state.data.Codigo)
                .then(
                    function (response) {
                        $scope.carregandoModal = false;
                        if (response.Status < 0){
                            if (response.Message == 'Para encerrar a saida e necessario gerar a nota fiscal')
                            {
                                $confirm({ text: "Para encerrar a saída é necessário antes gerar a nota fiscal!", title: "Gerar nota fiscal", ok: "Ok" })
                                .then(function () {
                                    $scope.toggleGerarNota();
                                });
                            }
                            else
                                $scope.$parent.toastr.error(response.Message, 'Encerramento NF de saída');
                        }
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.clear();
                            $scope.get();
                            $scope.$parent.toastr.success("NF de saída encerrada.");
                        }
                    },
                    function (error) {
                        $scope.carregandoModal = false;
                        $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.buscarTransportadoras = function () {
            entidadeAuxiliarService
                .getAllTransportadora()
                .then(
                function (response) {
                    $scope.state.transportadoras = response.Data;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }

        $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
                .getAllTipoMovimentacaoSaida()
                .then(
                    function (response) {
                        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);
                            $scope.getSeriePadrao();
                        }
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }

        $scope.getAllItemEntrada = function () {
            $scope.auxiliar.itemEntrada.filtro.codigoTerceiro = $scope.state.data.TerceiroDevolucao.Codigo;
            $scope.auxiliar.itemEntrada.filtro.skip = 0;
            $scope.auxiliar.itemEntrada.carregando = true;
            entradaService
                .getItensParaDevolucao($scope.auxiliar)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Ao requisitar itens de entradas');
                            console.error('Ao requisitar itens de entradas.', response.Exception);
                        }
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.itemEntrada.data);
                            for(let a of $scope.auxiliar.selected) {
                                for(let b of $scope.auxiliar.itemEntrada.data) 
                                {
                                    if(a.Produto == b.CorProduto.Codigo && a.Entrada == b.Entrada.Codigo)
                                    {
                                        b.Selecionado = true;
                                    }
                                }
                        }
                        }
                        $scope.auxiliar.itemEntrada.carregando = false;
                        $scope.auxiliar.itemEntrada.vazio = (!response.Data && response.Data.length == 0);
                        $scope.countItemEntrada();
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao requisitar itens de entradas.', 'Comunicação com o servidor');
                        console.error('Ao requisitar itens de entradas.', error);
                        $scope.auxiliar.itemEntrada.carregando = false;
                        $scope.auxiliar.itemEntrada.vazio = true;
                    }
                );
        };
        $scope.getMoreItensParaDevolucao = function () {
            $scope.auxiliar.itemEntrada.filtro.skip += $scope.auxiliar.itemEntrada.filtro.take;
            entradaService
                .getItensParaDevolucao($scope.auxiliar)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.auxiliar.itemEntrada.data = $scope.auxiliar.itemEntrada.data.concat(response.Data);
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                    }
                );
        };
        $scope.countItemEntrada = function () {
            entradaService
                .countItensParaDevolucao($scope.auxiliar.itemEntrada.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Ao requisitar itens de entradas');
                            console.error('Ao requisitar itens de entradas.', response.Exception);
                        }
                        else {
                            $scope.auxiliar.itemEntrada.count = response.Data;
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao requisitar itens de entradas.', 'Comunicação com o servidor');
                        console.error('Ao requisitar itens de entradas.', error);
                    }
                );
        };
        $scope.getMoreItemEntrada = function () {
            $scope.auxiliar.itemEntrada.filtro.skip += $scope.auxiliar.itemEntrada.filtro.take;
            entradaService
                .getItensParaDevolucao($scope.auxiliar.itemEntrada.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Ao requisitar itens de entradas');
                            console.error('Ao requisitar itens de entradas.', response.Exception);
                        }
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.itemEntrada.data);
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao requisitar itens de entradas.', 'Comunicação com o servidor');
                        console.error('Ao requisitar itens de entradas.', error);
                    }
                );
        };
        $scope.getToogleItemEntradaSelecao = function () {
            for (var i = 0; $scope.auxiliar.itemEntrada.data.length; i++) {
                $scope.auxiliar.itemEntrada.data[i].Selecionado = $scope.auxiliar.itemEntrada.allSelected;
            }
        };

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

        $scope.getSeriePadrao = function () {
            configService.getParametroLoja("SeriePadrao").then(function (data) {
                var parametro = data.Data;
                if (!parametro)
                    parametro = { ValorAtual: "" }

                $scope.auxiliar.serieSelecionada = filterArray($scope.auxiliar.serie.data, 'Codigo', parametro.ValorAtual);
            }, function (error) {
                $scope.$parent.toastr.error(error);
            });
        }

        $scope.getNaturezaPadrao = function () {
            configService.getParametroLoja("NaturezaPadrao").then(function (data) {
                var parametro = data.Data;
                if (!parametro)
                    parametro = { ValorAtual: "" }

                $scope.auxiliar.naturezaSelecionada = filterArray($scope.auxiliar.naturezas, 'CFOP', parametro.ValorAtual);
            }, function (error) {
                $scope.$parent.toastr.error(error);
            });
        }

        $scope.GerarNota = function () {
            $scope.carregandoGerador = true;
            console.log($scope.auxiliar.naturezaSelecionada.CFOP);
            saidaService
               .gerarNotaSaida($scope.state.data.Filial.Nome, $scope.state.data.Codigo, $scope.auxiliar.serieSelecionada.Codigo,
               $scope.auxiliar.naturezaSelecionada.CFOP, $scope.state.data.DataSaida, $scope.state.data.Volume, $scope.state.data.InformacaoAdicional,
                $scope.state.transportadora, $scope.state.peso, $scope.state.tipoFrete, $scope.state.Frete)
                .then(
                    function (response) {
                        $scope.carregandoGerador = false;
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Encerramento NF de saída');
                        else {
                            $scope.state.data = response.Data;
                            if ($scope.state.data.IndicaEncerrada == false)
                                $scope.setEncerrada();
                            $scope.$parent.toastr.clear();
                            $scope.toggleGerarNota();
                            $scope.$parent.toastr.success("NF Gerada com sucesso.");  
                        }
                    },
                    function (error) {
                        $scope.carregandoGerador = false;
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        }

        var filterArray = function (array, atributo, valor) {
            var item = $.grep(array, function (gp) {
                return gp[atributo] == valor;
            });
            if (!item || item.length == 0)
                return {};
            return item[0]
        }

        $scope.EnviaNotaSefaz = function () {
            
            $scope.state.carregando = true;
            console.log($scope.auxiliar.naturezaSelecionada.CFOP);
            saidaService
               .EnviaNotaSefaz($scope.state.data.NotaFiscal.Numero, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.data.Filial.Nome, $scope.state.data.Codigo)
                .then(
                    function (response) {
                        
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Encerramento NF de saída');
                        else {
                            $scope.state.data = response.Data;
                            $scope.$parent.toastr.clear();
                            $scope.$parent.toastr.success("NF Gerada com sucesso.");
                        }

                        $scope.state.carregando = false;
                    },
                    function (error) {
                        $scope.state.carregando = false;
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        }

        $scope.descartaItens = function () {

            $scope.state.data = $scope.state.oldData;
            $scope.state.item.ativo = false;
        };

        $scope.getNaturezas = function () {
            saidaService
                //.getNaturezas()
                
                .getNaturezasByRomaneioSaida($scope.state.data.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.auxiliar.naturezas = response.Data;
                            $scope.getNaturezaPadrao();
                        }

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

        $scope.prepareNewItem = function () {
            debugger;
            //$scope.state.oldData = $scope.state.data;
            $scope.state.dataOrigem = $scope.state.data;
            $scope.state.calculando = true;
            saidaService
                //.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 saída');
                            $scope.state.calculando = false;
                        }
                        else {
                            $scope.auxiliar.oldItens = ($scope.state.data.Itens ? $scope.state.data.Itens : []);
                            //$scope.state.data = response.Data.Entrada;
                            $scope.state.ultimoProduto = response.Data.Produto;
                            $scope.state.data = $scope.state.dataOrigem;
                            $scope.state.data.Quantidade = response.Data.Quantidade;

                            $scope.state.data.Valor = response.Data.Valor;
                            $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.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 != null && response.Data.Item != undefined) {
                                if (response.Data.Item.CorProduto != null && response.Data.Item.Quantidade > 0)
                                    $scope.state.data.Itens.push(response.Data.Item);
                            }

                            $scope.state.filtroProduto.codigo = "";
                            if ($scope.$parent.config.GradeEntradaSaida || !$scope.state.ultimoProduto.CodigosBarras[0])
                                $scope.toggleItem();
                            else
                                setTimeout(function () { $('input[ng-model*="state.filtroProduto.codigo"]').first().focus() }, 500);
                                
                            //    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.addItemDevolucao = function () {
            var itens = $filter('filter')($scope.auxiliar.itemEntrada.data, function (i) { return i.Selecionado; });
            if (itens.length == 0) {
                $scope.$parent.toastr.info('Nenhum item foi selecionado.');
                return;
            }
            saidaService
                .addItemDevolucao($scope.state.data, itens)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Ao adicionar itens de devolução');
                            console.error('Ao adicionar itens de devolução', response.Exception);
                            $scope.auxiliar.selected = [];
                        }
                        else {
                            $scope.state.data = response.Data;
                            $scope.auxiliar.selected = [];
                            $scope.toggleEntradas();
                        }

                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao adicionar itens de devolução', 'Comunicação com o servidor');
                        console.error('Ao adicionar itens de devolução', error);
                    }
                );
        }
        $scope.calculate = function (itemIndex, index, item) {
            debugger;
            $scope.state.carregando = true;
            $scope.state.item.ativo = false;
            angular.copy($scope.state.data, $scope.state.itensSaida);

            if (itemIndex >= 0 && index >= 0 && ($scope.state.data.ItensOrigem != null && $scope.state.data.ItensOrigem.length > 0))
                validaLimiteItem(itemIndex, index);

            if (item == null) {
                if ($scope.state.ultimoProduto != null && $scope.state.ultimoProduto.Codigo != null)
                    $scope.state.itensSaida.Itens = $scope.state.data.Itens.filter(a => a.Produto.Codigo == $scope.state.ultimoProduto.Codigo);
            }
            else {
                $scope.state.itensSaida.Itens = $scope.state.data.Itens.filter(a => a.Produto.Codigo == item.Produto.Codigo);
            }

                $scope.state.calculando = true;
                saidaService
                    .calculate($scope.state.itensSaida)
                    .then(
                        function (response) {
                            debugger;
                            if (response.Status < 0) {
                                $scope.state.carregando = false;
                                $scope.state.calculando = false;
                                $scope.state.data = response.Data;
                                $scope.$parent.toastr.error(response.Message, 'Recalculando saída');
                            }
                            else {
                                $scope.state.data = response.Data;
                                saveNoRedirect();
                                angular.copy(response.Data, $scope.state.oldData);
                                $scope.state.calculando = false;
                                $scope.state.carregando = false;
                            }

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

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

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

        var validaLimiteItem = function (itemIndex, index) {
            var item = $scope.state.data.Itens[itemIndex].Tamanhos[index];
            if (Number(item.Quantidade) > Number(item.Limite))
                $scope.state.data.Itens[itemIndex].Tamanhos[index].Quantidade = $scope.state.data.Itens[itemIndex].Tamanhos[index].Limite;

            $scope.state.data.ItensOrigem[itemIndex].ItemEntrada.Tamanhos[index].Quantidade = $scope.state.data.Itens[itemIndex].Tamanhos[index].Quantidade;
            calculateOrigem(itemIndex);
        }

        var calculateOrigem = function (itemIndex) {
            var itens = $scope.state.data.ItensOrigem[itemIndex].ItemEntrada.Tamanhos;
            var total = 0;

            for (var i = 0; i < itens.length; i++)
                total += $scope.state.data.ItensOrigem[itemIndex].ItemEntrada.Tamanhos[i].Quantidade;


            $scope.state.data.ItensOrigem[itemIndex].ItemEntrada.Quantidade = total;
        }

        var saveNoRedirect = function () {
            saidaService
                .save($scope.state.data)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Gravação da saída");
                    },
                    function (error) { $scope.$parent.toastr.error(error, "Comunicação com o servidor"); }
                );
        }

        $scope.toggleNotas = function () {
            $scope.state.notasAtivo = !$scope.state.notasAtivo;
        };

        $scope.toggleGerarNota = function () {
            $scope.state.data.DataSaida = new Date();
            $scope.state.data.Volume = 0;
            $scope.buscarTransportadoras();
            $scope.auxiliar.modalNota = !$scope.auxiliar.modalNota;
            $scope.state.showModalSaida = !$scope.state.showModalSaida;
        };

        $scope.toggledanfe = function () {
            $scope.auxiliar.modaldanfe = !$scope.auxiliar.modaldanfe;
        };
        $scope.togglemodalxml = function () {
            $scope.auxiliar.modalxml = !$scope.auxiliar.modalxml;
        };

        $scope.toggleItem = function () {
            $scope.state.item.ativo = !$scope.state.item.ativo;
            if (!$scope.state.item.ativo) {
                debugger;
                $scope.state.filtroProduto.codigo = '';
                setTimeout(function () { $('input[ng-model*="state.filtroProduto.codigo"]').first().focus() }, 500);
                $scope.calculate();
            }
            else
                $timeout(function () { $('#add-item form.form input[ng-model*="tamanho.Quantidade"]').first().focus(); });
        };
        $scope.toggleEntradas = function () {
            $scope.auxiliar.selected = [];
            $scope.auxiliar.itemEntrada.ativo = !$scope.auxiliar.itemEntrada.ativo;
            if ($scope.auxiliar.itemEntrada.ativo) {
                $scope.auxiliar.itemEntrada.filtro.chaves = '';
                $('input[ng-model*="auxiliar.itemEntrada.filtro.chaves"]').first().focus();
                $scope.getAllItemEntrada();
            } 
        };

        //$scope.deleteItem = function (index) {

        //    if ($scope.state.data.Itens.length > 0)
        //        $scope.state.data.Itens.splice(index, 1);
        //    if ($scope.state.data.ItensOrigem.length > 0)
        //        $scope.state.data.ItensOrigem.splice(index, 1);

        //    $scope.calculate();
        //};
        $scope.deleteItem = function (item) {
            debugger;
            var indexO = $scope.state.data.Itens.indexOf(item);

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

            $scope.calculate();
        };
        $scope.removeItem = function (item) {
            debugger
            saidaService
                .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.calculando = false;
                            $scope.state.carregando = false;
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Sem comunicação com o servidor.');
                    }
                );
            //}
        };

        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.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.showHeader = function (index) {
            var list = $scope.orderedItens[index - 1];
            var list2 = $scope.orderedItens[index];
            if (list == undefined || list2 == undefined)
                return;

            return (index == 0 || $scope.orderedItens[index - 1].Grade != $scope.orderedItens[index].Grade);
        }

        $scope.toggleModalLancamento = function () {
            $scope.state.showModalSaida = !$scope.state.showModalSaida;
            //$scope.state.toggleGerarNota();
        };

        $scope.validaMaximo = function (itemIndex, $index, item, tamanhos) {
            if (Number(item.Quantidade) > Number(item.Limite))
                $scope.auxiliar.itemEntrada.data[itemIndex].Tamanhos[$index].Quantidade = item.Limite;

            $scope.auxiliar.itemEntrada.data[itemIndex].Quantidade = totalizador(itemIndex, $index, item, tamanhos);
        }

        var totalizador = function (itemIndex, $index, item, tamanhos) {
            var total = 0;

            for (var i = 0; i < tamanhos.length; i++)
                total += Number(tamanhos[i].Quantidade);

            return total;
        }

        $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();
    }

})();