(function () {
    "use strict";

    angular.module('pos').controller('pedidoDetailController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', 'pedidoService', '$confirm', '$confirmModalDefaults', '$interval', 'entidadeAuxiliarService', '$timeout', 'clienteService'];

    function controller($scope, $state, $stateParams, $window, pedidoService, $confirm, $confirmModalDefaults, $interval, entidadeAuxiliarService, $timeout, clienteService) {
        $scope.$parent.initializeLayout('Pedido');
        $scope.retroativo = false;
        var intervalPromise;

        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.state = {
            data: {
                Numero: decodeURIComponent($stateParams.id)
            },
            carregando: false,
            vazio: false,
            erro: {
                ativo: false,
                mensagem: ''
            },
            TEFCancel: {
                modalTEF: false,
                TEFProcessamento: false,
                IDSiTef: '',
                IDTefRelated: '',
                Status: '',
                Processado: 0,
            },
            index: -1,
            modificarTodos: -1,
        };


        $scope.statusFaturarPedidoModal = {
            statusIncluirCpf: false,
            statusModal: false,
        };

        $scope.vendedores = [];

        //[Inicializa funcões]
        $scope.initialize = function () {

            $scope.refresh();
            $scope.getAllVendedor();

        };

        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.Emissao.substring(0, 10) != yyyy + '-' + mm + '-' + dd) {
                $scope.retroativo = true;
            }
        }

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

            $scope.state.carregando = true;
            $scope.state.vazio = false;
            pedidoService
                .get($scope.state.data.Numero)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                           
                            $scope.state.data = response.Data;
                            /*verifica se existe cliente selecionado*/
                            $scope.statusFaturarPedidoModal.statusIncluirCpfOuCnpj = $scope.state.data.Cliente.CPF !== '';

                            validateRetroativo();
                            if ($scope.state.data.Status === 0 || $scope.state.data.Status == 4) {
                                $state.go('state-venda-add', { id: $scope.state.data.Numero });
                            }
                        }

                        $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.filterVendors = function (item) {
            return ($scope.state.FiltroVendedor == "" || !$scope.state.FiltroVendedor || item.Nome.toUpperCase().indexOf($scope.state.FiltroVendedor.toUpperCase()) >= 0)
        }

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


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

        $scope.refresh = function () {
            $scope.get();
        };

        $scope.SetStatusReimpressao = function () {
            $confirm({ text: "Tem certeza que deseja reimprimir nota?" }).then(function () {
                notaFiscalService.SetStatusReimpressao();
            });

        };

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

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

        $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.stateGoTicket = function () {
            $state.go('state-ticket-detail', { id: $scope.state.data.Venda.Ticket, emissao: $scope.state.data.Emissao });
        };
        $scope.stateGoCliente = function () {
            $state.go('state-cliente-detail', { id: $scope.state.data.Cliente.Codigo });
        };


        $scope.updateCPFandGenerateTicket = function () {
            //verificar se o cpf foi informado caso o campo esteja checado
            if ($scope.statusFaturarPedidoModal.statusIncluirCpfOuCnpj && $scope.state.data.Cliente.CPF === '') {
                $scope.$parent.toastr.error("Informe o CPF desejado pelo cliente ou desmarque a opção de incluir CPF na Nota Fiscal", 'Atenção');
                return;
            }

            if ($scope.state.data.Cliente.PessoaFisica == false && $scope.statusFaturarPedidoModal.statusIncluirCpfOuCnpj && $scope.state.data.Cliente.CPF.length == 11) {
                $scope.$parent.toastr.error("Informe o CNPJ desejado pelo cliente ou desmarque a opção de incluir CNPJ na Nota Fiscal", 'Atenção');
                return;
            }

            if (!$scope.statusFaturarPedidoModal.statusIncluirCpfOuCnpj)
                $scope.state.data.Cliente.CPF = '';

            if ($scope.state.data.Cliente.CPF === '') {
                $scope.generateTicketPedido();
                return;
            } else
                //verificar CPF valido
                clienteService.validaCpf($scope.state.data.Cliente.CPF).then(
                    function (response) {
                        if (response.Data) {
                            //atualizar o cpf no loja_pedido
                            pedidoService
                                .updateCPF($scope.state.data, $scope.state.data.Cliente.CPF)
                                .then(
                                    function (response) {
                                        
                                        if (response.Status < 0)
                                            $scope.$parent.toastr.error(response.Message, 'Erro na atualização do CPF no pedido');
                                        else {
                                            //gerar o ticket
                                            $scope.generateTicketPedido();
                                        }
                                    },
                                    function (error) {
                                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                                    }
                                );
                        }
                        else {
                            $scope.$parent.toastr.error('CPF não é valido. Verifique e tente novamente.');
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        };

        $scope.generateTicketPedido = function () {
            pedidoService
                .generateTicketPedido($scope.state.data, null, null, null, $scope.statusFaturarPedidoModal.statusIncluirCpfOuCnpj)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            if (response.Message.substring(0, 41) == "Para vendas com o valor superior ou igual") {
                                $confirm({ text: response.Message, title: "CPF/CNPJ obrigatório", ok: "Ok" });
                                $scope.state.carregandoClose = false;
                            }
                            else {
                                $scope.$parent.toastr.error(response.Message, "Serviço");
                                $scope.state.carregandoClose = false;
                            }
                        }
                        else {
                            $scope.$parent.toastr.success("Ticket gerado com êxito. Confira neste novo formulário.");
                            $state.go('state-ticket-detail', { id: response.Data.Venda.Ticket, emissao: response.Data.Emissao });
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                    }
                );
        };

        $scope.openCPF = function () {
            if ($scope.state.data.Venda.Ticket) {
                $scope.$parent.toastr.success("Ticket já existente. Confira neste formulário.");
                $state.go('state-ticket-detail', { id: $scope.state.data.Venda.Ticket, emissao: $scope.state.data.Emissao });
                return;
            }
            $scope.statusFaturarPedidoModal.statusModal = true;
        };



        $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) {
                    $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.cancelPedidoDetail = function () {

            var ret = $scope.ValidaPagamentoTEF();
            if (ret)
                return;

            if ($scope.state.data.Status != 3) {
                pedidoService
                    .cancel($scope.state.data.Numero)
                    .then(
                        function (response) {
                            if (response.Status < 0)
                                $scope.$parent.toastr.error(response.Message, 'Serviço');
                            else {
                                $scope.state.data = response.Data;
                                $scope.$parent.toastr.success("Pedido cancelado com sucesso.");
                            }
                        },
                        function (error) { $scope.$parent.toastr.error(error); }
                    );
            }
            else {
                $confirmModalDefaults.defaultLabels.title = "Atenção!";
                $confirm({ text: "Não é possível cancelar um pedido faturado, repita o processo na aba tickets" })
            }

        }

        $scope.CancelTEF = function (tefid) {

            $scope.toggleTEF();
            $scope.state.TEFCancel.TEFProcessamento = true;
            $scope.state.TEFCancel.IDSiTef = guid(); // new id
            $scope.state.TEFCancel.IDTefRelated = tefid;

            pedidoService.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 () {
            ;
            $scope.state.TEFCancel.modalTEF = !$scope.state.TEFCancel.modalTEF;
            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');
                    }
                );
                $interval.cancel(intervalPromise);
            }
        };

        $scope.StatusTEFCancel = function () {
            $interval.cancel(intervalPromise);
            pedidoService.GetStatusTEFCancel($scope.state.TEFCancel.IDSiTef).then(
                function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Serviço');
                    else {
                        if (response.Data) {
                            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") {
                                pedidoService.ConfirmaCancelamentoTEF($scope.state.TEFCancel.IDSiTef, $scope.state.data.Numero).then(
                                    function (response) {
                                        $scope.state.data = response.Data;
                                        $scope.$parent.toastr.success('Cancelamento de TEF concluído.');
                                        $scope.state.TEFCancel.TEFProcessamento = false;
                                        $scope.toggleTEF();

                                        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.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');
                }
            );

        }


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

})();