(function () {
    "use strict";

    angular.module('pos').controller('ticketDetailController', controller);
    controller.$inject = ['$scope', '$state', '$alert', '$stateParams', '$window', 'ticketService', '$interval', 'notaFiscalService', '$confirm', '$confirmModalDefaults', 'pedidoService', '$routeParams', '$timeout', 'entidadeAuxiliarService'];

    function controller($scope, $state, $alert, $stateParams, $window, ticketService, $interval, notaFiscalService, $confirm, $confirmModalDefaults, pedidoService, $routeParams, $timeout, entidadeAuxiliarService) {
        $scope.$parent.initializeLayout('Ticket');
        $scope.retroativo = false;

        var intervalPromise;
        $scope.possuiDanfe = false;
        $scope.buscaDanfe = 0;
        function guid() {
            function s4() {
                return Math.floor((1 + Math.random()) * 0x10000)
                    .toString(16)
                    .substring(1);
            }
            return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
                s4() + '-' + s4() + s4() + s4();
        }

        //[Inicializa objetos]
        $scope.Danfe = "";
        $scope.vendedores = [];
        $scope.alteraMultiplosVendedores = false;
        $scope.indicaRetroativo = false;
        $scope.tiposFrete = [
            { Tipo: 0, Descricao: "0 - Por conta do emitente" },
            { Tipo: 1, Descricao: "1 - Por conta do destinatário" },
            { Tipo: 2, Descricao: "2 - Por conta de terceiros" },
            { Tipo: 9, Descricao: "9 - Sem frete" }
        ];
        $scope.state = {
            modaldanfe: false,
            modaldanfeReferencia: false,
            modalCancelamento: false,
            modalEmailNfe: false,
            modalNfeReferencia: false,
            transportadoras: [],
            data: {
                Ticket: decodeURIComponent($stateParams.id),
                Emissao: getDateWithoutTime(decodeURIComponent($stateParams.emissao)),
                Danfe: decodeURIComponent($stateParams.danfe)
            },
            carregando: false,
            vazio: false,
            justificativa: '',
            processoCancelamento: false,
            email: '',
            TEFCancel: {
                modalTEF: false,
                TEFProcessamento: false,
                IDSiTef: '',
                IDTefRelated: '',
                Status: '',
                Processado: 0,
            },
            index: -1,
            modificarTodos: false,
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.refresh();
            $scope.getAllVendedor();
            $scope.Danfe = ($stateParams.danfe ? $scope.state.data.Danfe : "");


        };
        $scope.historyBack = function () {
            $window.history.back();
        }

        var validateRetroativo = function () {

            var today = new Date();
            var dd = today.getDate();
            var mm = today.getMonth() + 1;
            var yyyy = today.getFullYear();

            if (dd < 10) {
                dd = '0' + dd;
            }
            if (mm < 10) {
                mm = '0' + mm;
            }

            if ($scope.state.data && $scope.state.data.Emissao &&   $scope.state.data.Emissao.substring(0, 10) != yyyy + '-' + mm + '-' + dd) {
                $scope.retroativo = true;
            }
        }

        $scope.filterVendors = function (item) {
            return ($scope.state.FiltroVendedor == "" || !$scope.state.FiltroVendedor || item.Nome.toUpperCase().indexOf($scope.state.FiltroVendedor.toUpperCase()) >= 0)
        }

        $scope.get = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            if ($stateParams.danfe && $stateParams.danfe == "1") {
                for (var i = 1; i < 7; i++) {
                    var tempo = i * 3000;
                    $timeout(function () {
                        get();
                    }, tempo);
                }

            }
            else {
                get()
            }


        };

        function getDateWithoutTime(date) {
            var dateObj = new Date(date);
            var dateWithoutTime = dateObj.toLocaleDateString();
            //var dateWithoutTime = dateObj.setHours(0, 0, 0, 0);

            return dateWithoutTime;
        }


        var get = function () {

            console.log($scope.state.data.Emissao);
            ticketService
                .get($scope.state.data.Ticket, $scope.state.data.Emissao)
                .then(
                    function (response) {
                        if (response.Status < 0) {

                            $scope.state.carregando = false;
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        }
                        else {
                            if ($scope.possuiDanfe && $stateParams.danfe && $stateParams.danfe == "1") {
                                $scope.state.carregando = false;
                                return;
                            }
                            if (!$scope.possuiDanfe && $scope.buscaDanfe > 4) {
                                $scope.state.carregando = false;
                                $scope.$parent.toastr.error('O tempo limite de envio para busca foi excedido, tente consultar a nota posteriormente');
                                return;
                            }

                            $scope.state.data = response.Data;
                            validateRetroativo();

                            if ($stateParams.danfe && $stateParams.danfe == "1" && $scope.state.data.NotaFiscal.PDFFile) {
                                $scope.possuiDanfe = true
                                $scope.toggledanfe();
                            }
                            else if ($stateParams.danfe && $stateParams.danfe == "1" && !$scope.state.data.NotaFiscal.PDFFile) {
                                $scope.buscaDanfe += 1;
                            }
                            permiteAlterarMultiplosVendedores($scope.state.data.Emissao);
                        }

                        if (!$stateParams.danfe && $stateParams.danfe != "1") {
                            $scope.state.carregando = false;
                            $scope.state.vazio = ($scope.state.data == 0);
                        }
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                        $scope.state.carregando = false;
                        $scope.state.vazio = false;
                    }
                );
        }

        $scope.refresh = function () {

            $scope.get();
            $scope.buscarTransportadoras();
        };
        $scope.SetStatusReimpressao = function () {
            $scope.state.carregando = true;
            $confirm({ text: "Tem certeza que deseja reimprimir nota?" }).then(function () {

                notaFiscalService.SetStatusReimpressao($scope.state.data.NotaFiscal.Numero, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.data.Filial.Codigo, $scope.state.data.NotaFiscal.IDCFSAT).then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.$parent.toastr.success("Nota fiscal adicionada a fila de reimpressão!", 'Serviço');
                        $scope.state.carregando = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.carregando = false;
                    }
                );
            });
        };

        $scope.SendNfeEmail = function () {
            if ($scope.state.email == '') {
                $scope.$parent.toastr.error(error, 'Digite um email!');
                return;
            }

            $scope.state.carregando = true;
            notaFiscalService.SendNfeEmail($scope.state.data.NotaFiscal.NFE.Chave, $scope.state.email).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else
                        $scope.$parent.toastr.success("Email enviado!", 'Serviço');
                    $scope.state.carregando = false;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    $scope.state.carregando = false;
                }
            );
            $scope.toogleModalEmailNfe();
        };

        $scope.stateGoPedido = function () {
            $state.go('state-pedido-detail', { id: $scope.state.data.Pedido.Numero });
        };
        $scope.stateGoCliente = function () {
            $state.go('state-cliente-detail', { id: $scope.state.data.Cliente.Codigo });
        };
        $scope.stateGoNotaFiscal = function () {
            $state.go('state-nota-fiscal-detail', { numero: $scope.state.data.NotaFiscal.Numero, serie: $scope.state.data.NotaFiscal.Serie.Codigo, terminal: $scope.state.data.Terminal.Codigo, chave: $scope.state.data.NotaFiscal.NFE.Chave });
        };

        $scope.CancelarNota = function () {

            $interval.cancel(intervalPromise);
            $scope.state.carregando = true;

            notaFiscalService.GetStatusCancelamentoByChaveNFE($scope.state.data.NotaFiscal.NFE.Chave).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        if (response.Data) {
                            if ((response.Data == "1" || response.Data == "0" || response.Data == "2") && $scope.continue) {
                                //if (response.Data == "0")
                                //    $scope.$parent.toastr.error('Não foi possível comunicar com a impressora não fiscal');
                                $scope.state.carregando = false;
                                $scope.state.data.Status = '2';
                                $scope.$parent.toastr.success('Nota Cancelada!');
                                if (response.Data == "2" && $scope.state.data) {
                                    $confirm({ text: "Foi detectado um problema de conexão, caso a venda possua transações do programa de fidelidade, o estorno das mesmas não poderão ser efetuados imediatamente,  aguardar alguns minutos ate que os valores sejam atualizados." }).then(function () { });
                                }
                                else {
                                    if ($scope.$parent.config.Fidelidade.Ativo && ($scope.state.data.Cliente.Fidelidade == true || $scope.state.data.Cliente.Fidelidade == null)) {
                                        $scope.$parent.toastr.success('Estorno de créditos efetuado!');
                                    }
                                }


                                 
                                $scope.state.carregando = false;
                                $scope.toggleModalCancelamento();
                                $scope.continue = false;
                                $interval.cancel(intervalPromise);
                                $scope.state.go("state-ticket-detail", { id: $scope.data.Ticket, emissao: $scope.data.Emissao }, { reload: false, location: 'replace' });
                                return;
                            }
                            else {
                                if ($scope.continue) {
                                    $scope.state.carregando = false;
                                    $scope.$parent.toastr.error('Não foi possivel cancelar nota ' + response.Data);
                                    $scope.state.carregando = false;
                                    $scope.toggleModalCancelamento();
                                    $scope.continue = false;
                                    $interval.cancel(intervalPromise);
                                    $scope.refresh();
                                    return;
                                }
                            }
                        }
                    }

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


        $scope.cancelarNotaPorTicket = function () {
            $scope.state.carregando = true;

            ticketService.inserirCancelamento($scope.state.data.Ticket, $scope.state.data.Emissao, $scope.state.justificativa, $scope.state.data.Terminal.Codigo).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        $scope.$parent.toastr.success('Devolução cancelada com sucesso');
                        $scope.toggleModalCancelamentoDevolucao();
                        $scope.refresh();
                    }
                },
                function (error) {
                    $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    $scope.state.carregando = false;
                }
            );
        };

        $scope.irParaVenda = function () {
            $state.go('state-venda-add');
        }

        $scope.CancelarNotaClick = function () {
            if ($scope.state.justificativa.length < 15 || $scope.state.justificativa.length > 255) {
                $alert({ text: "Voce deve digitar entre 15 e 255 caracteres na justificativa!", title: $scope.Title });
                return;
            }

            $scope.state.carregando = true;
            if (!$scope.state.justificativa) {
                $alert({ text: "Voce deve digitar a justificativa!", title: $scope.Title });
                $scope.state.carregando = false;
                return;
            }

            var nf = $scope.state.data.NotaFiscal.Numero;
            if ($scope.state.data.NotaFiscal.IDCFSAT != null && $scope.state.data.NotaFiscal.IDCFSAT != "")
                nf = nf + "|" + $scope.state.data.NotaFiscal.IDCFSAT;

            notaFiscalService.InserirCancelamentoByChaveNFE(nf, $scope.state.data.NotaFiscal.Serie.Codigo, $scope.state.justificativa, $scope.state.data.Terminal.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                            $scope.state.carregando = false;
                        }
                        else {
                            $scope.continue = true;
                            $scope.state.carregando = false;
                            $scope.CancelarNota();

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

        $scope.ValidaPagamentoTEF = function () {

            for (var i = 0; i < $scope.state.data.Pagamentos.length; i++) {
                if (!$scope.state.data.Pagamentos)
                    continue;
                if ($scope.state.data.Pagamentos[i].TEFID && $scope.state.data.Pagamentos[i].Valor > 0) {
                    debugger
                    $scope.CancelTEF($scope.state.data.Pagamentos[i].TEFID);
                    $scope.state.modalCancelamento = false;
                    $scope.state.processoCancelamento = true;
                    $scope.$parent.toastr.warning('Voce deve cancelar todos os itens tef para efetuar o cancelamento!', 'Cancelamento');
                    return true;
                }
            }
            return false;
        }


        $scope.toggleModalCancelamentoDevolucao = function () {
            $scope.state.modalCancelamentoDevolucao = !$scope.state.modalCancelamentoDevolucao;
        }

        $scope.toggleModalCancelamento = function () {
            if ($scope.state.modalCancelamento == false) {
                var ret = $scope.ValidaPagamentoTEF();
                if (ret)
                    return;
            }
            if ($scope.state.modalCancelamento == true) {
                $scope.state.modalCancelamento = false;
                $scope.state.processoCancelamento = false;
            }
            else
                $scope.state.modalCancelamento = true;
        };

        $scope.toogleModalEmailNfe = function () {
            $scope.state.modalEmailNfe = !$scope.state.modalEmailNfe;
        };

        $scope.buscarTransportadoras = function () {
            entidadeAuxiliarService.getAllTransportadora().then(
                function (response) {
                    $scope.state.transportadoras = response.Data;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
            );
        }
        $scope.tooglemodalNfeReferencia = function () {
            $scope.state.modalNfeReferencia = !$scope.state.modalNfeReferencia;
        };

        $scope.iniciar = function () {
            intervalPromise = $interval(function () {
                $scope.CancelarNota();
            }, 1000);
        };

        $scope.AbreModalCancelamento = function () {
            if ($scope.state.data.Status == "2")
                $scope.$parent.toastr.error('Esta nota ja foi cancelada!');
            else
                $scope.toggleModalCancelamento();

        }

        $scope.InterromperProcesso = function () {
            notaFiscalService
                .DeleteByChaveNFE($scope.state.data.NotaFiscal.NFE.Chave)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        $scope.continue = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.continue = false;
                    }
                );
            $scope.toggleModalCancelamento();
        }

        $scope.continue = false;

        $scope.permiteAlterarvendedor = function (dataVenda) {

            var alteraVendedor = $scope.$parent.config.AlteraVendedor;
            var alteraRetroativo = $scope.$parent.config.AlteraVendedorVendaRetroativa;

            if (alteraVendedor) {
                if (!alteraRetroativo) {
                    var hoje = new Date(new Date().setHours(0, 0, 0, 0));
                    var venda = new Date(dataVenda);

                    if (venda < hoje)
                        return false;

                    return true;
                }
                else
                    return true;
            }
            else
                return false;
        }

        var permiteAlterarMultiplosVendedores = function (dataVenda) {
            var alteraVendedor = $scope.$parent.config.AlteraVendedor;
            var alteraRetroativo = $scope.$parent.config.AlteraVendedorVendaRetroativa;
            var multiplosVendedores = $scope.$parent.config.MultiplosVendedores;

            var hoje = new Date(new Date().setHours(0, 0, 0, 0));
            var venda = new Date(dataVenda);

            if (venda < hoje)
                $scope.indicaRetroativo = true;

            if (venda < hoje && alteraVendedor && alteraRetroativo && multiplosVendedores)
                $scope.alteraMultiplosVendedores = true;
            $scope.alteraMultiplosVendedores = false;
        }

        $scope.CancelTEF = function (tefid) {
            debugger;
            $scope.toggleTEF(false);
            $scope.state.TEFCancel.TEFProcessamento = true;
            $scope.state.TEFCancel.IDSiTef = guid(); // new id
            $scope.state.TEFCancel.IDTefRelated = tefid;

            ticketService.InserirTEFCancel($scope.state.TEFCancel.IDSiTef, $scope.state.TEFCancel.IDTefRelated).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        intervalPromise = $interval(function () {
                            $scope.StatusTEFCancel();
                        }, 500);
                    }
                },
                function (error) {
                    $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    $scope.state.TEFCancel.TEFProcessamento = false;
                }
            );
        }

        $scope.toggleTEF = function (cancelaRequisicao) {
            if (cancelaRequisicao == null)
                cancelaRequisicao = true;
            $scope.state.TEFCancel.modalTEF = !$scope.state.TEFCancel.modalTEF;
            $interval.cancel(intervalPromise);
            if (cancelaRequisicao)
            if (!$scope.state.TEFCancel.modalTEF) {
                $scope.state.TEFCancel.TEFProcessamento = false;
                var terminal = $scope.$parent.config.Terminal.Codigo;
                pedidoService.CancelarRequisicaoTEFCancel(terminal).then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Não foi possível cancelar as transações pendentes. Cancele a transação no PINPAD e tente novamente.');
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
      
            }

        };

        $scope.StatusTEFCancel = function () {
            $interval.cancel(intervalPromise);
            ticketService.GetStatusTEFCancel($scope.state.TEFCancel.IDSiTef).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        if (response.Data) {
                            debugger
                            var codigo_processamento = response.Data.substring(0, 1);
                            var mensagem_processamento = response.Data.substring(4);

                            $scope.state.TEFCancel.Status = mensagem_processamento;

                            if (codigo_processamento == "1") {
                                ticketService.ConfirmaCancelamentoTEF($scope.state.TEFCancel.IDSiTef, $scope.state.data.Ticket, $scope.state.data.Emissao).then(
                                    function (response) {
                                        $scope.state.data = response.Data;
                                        $scope.$parent.toastr.success('Cancelamento de TEF concluído.');
                                        $scope.state.TEFCancel.TEFProcessamento = false;
                                        $scope.state.TEFCancel.IDSiTef = "";
                                        $timeout(function () {
                                            $scope.toggleTEF(false);
                                            if ($scope.state.processoCancelamento) {
                                                $scope.toggleModalCancelamento();
                                            }
                                        },1000
                                        )
                                        $interval.cancel(intervalPromise);
                                        return;
                                    });
                                return;
                            }
                            else {
                                if (codigo_processamento == "-1") {
                                    $scope.$parent.toastr.error('Não foi possivel cancelar o TEF!' + mensagem_processamento);
                                    $scope.state.TEFCancel.TEFProcessamento = false;
                                    return;
                                }
                            }

                            intervalPromise = $interval(function () {
                                $scope.StatusTEFCancel();
                            }, 500);
                        }
                    }
                },
                function (error) {
                    $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    $scope.state.TEFCancel.TEFProcessamento = false;
                }
            );
        };

        $scope.PdfFileText = function () {
            return $scope.state.data.NotaFiscal.PDFFile;
            currentBlob = new Blob(text, { type: 'application/pdf' });
            return URL.createObjectURL(currentBlob);
        };

        $scope.PdfReferenciaFileText = function () {
            return $scope.state.data.NotaFiscalReferencia.PDFFile;
            currentBlob = new Blob(text, { type: 'application/pdf' });
            return URL.createObjectURL(currentBlob);
        };

        $scope.EmitirNotaReferencia = function (Tipo) {
            $scope.state.carregando = true;
            notaFiscalService.EmitirNotaReferencia($scope.state.data, $scope.state.data.Filial.Codigo, Tipo)
                .then(
                    function (response) {

                        if (response.Status < 0)
                            $alert({ text: response.Message, title: $scope.Title });
                        else {
                            $scope.$parent.toastr.success('NFE gerada com sucesso', '');
                        }
                        $scope.refresh();
                        $scope.state.carregando = false;
                        $scope.tooglemodalNfeReferencia();

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

        }

        $scope.toggledanfe = function () {
            $scope.state.modaldanfe = !$scope.state.modaldanfe;
        };
        $scope.toggledanfeReferencia = function () {
            $scope.state.modaldanfeReferencia = !$scope.state.modaldanfeReferencia;
        };

        $scope.PrintTEF = function (tefid) {
            pedidoService.InserirReimpressaoTEF(tefid).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        $scope.$parent.toastr.success('Comprovante reenviado para a fila de impressão', 'Reimpressão TEF');
                    }
                },
                function (error) {
                    $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                }
            );

        }

        $scope.getAllVendedor = function () {
            $scope.carregandoVendedores = true;
            entidadeAuxiliarService
                .getAllVendedor()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.vendedores);
                        $scope.carregandoVendedores = false;
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                        $scope.carregandoVendedores = false;
                    }
                );
        };

        $scope.selecionarVendedorModal = function (item) {


            if (!$scope.state.modificarTodos) {
                $scope.state.data.Itens[$scope.state.index].Vendedor.Nome = item.Nome;
                $scope.state.data.Itens[$scope.state.index].Vendedor.Codigo = item.Codigo;
            } else {
                for (var i = 0; i < $scope.state.data.Itens.length; i++) {
                    $scope.state.data.Itens[i].Vendedor.Nome = item.Nome;
                    $scope.state.data.Itens[i].Vendedor.Codigo = item.Codigo;
                }

            }
            $scope.state.carregando = true;



            ticketService.saveVendors($scope.state.data).then(
                function (response) {
                    $scope.state.data = response.Data;
                    $scope.modalAlterarVendedor = false;
                    $scope.state.carregando = false;
                },
                function (error) {
                    $scope.$parent.toastr.error(error);
                })
            $scope.refresh();
        }

        $scope.toggleModalAlterarVendedor = function (index, todos) {
            if (index >= 0)
                $scope.state.index = index;
            $scope.state.modificarTodos = todos;
            $scope.modalAlterarVendedor = !$scope.modalAlterarVendedor;
        }

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

})();