(function () {
    "use strict";

    angular.module('pos').controller('_layoutController', controller);
    controller.$inject = ['notaFiscalComplementarService','$scope', '$state', '$window', '$confirm', '$timeout', 'tools', 'toastr', 'configService', 'securityService', 'caixaService', 'pedidoService', 'licencaService', '$confirmModalDefaults', '$location', '$rootScope'];

    function controller(notaFiscalComplementarService, $scope, $state, $window, $confirm, $timeout, tools, toastr, configService, securityService, caixaService, pedidoService, licencaService, $confirmModalDefaults, $location, $rootScope) {


        // TRATA FULLSCREEN E DETECTA EVENTO DE 'ESC' 

        $scope.mf = "";

        $scope.trataESCnaTelaCheia = function () {
            $scope.$apply(function () {
                $scope.telaCheia = false;
            });
        }


        if (document.addEventListener) {
            document.addEventListener('webkitfullscreenchange', exitHandler, false);
            document.addEventListener('mozfullscreenchange', exitHandler, false);
            document.addEventListener('fullscreenchange', exitHandler, false);
            document.addEventListener('MSFullscreenChange', exitHandler, false);
        }

        function exitHandler() {


            if (document.webkitIsFullScreen === false) {

                $scope.trataESCnaTelaCheia();

            }
            else if (document.mozFullScreen === false) {
                $scope.trataESCnaTelaCheia();
            }
            else if (document.msFullscreenElement === false) {
                $scope.trataESCnaTelaCheia();
            }
        }

        $scope.toggleFullScreen = function () {
            if (!document.fullscreenElement) {
                document.documentElement.requestFullscreen();
                $scope.telaCheia = true;


            } else {

                if (document.exitFullscreen) {
                    document.exitFullscreen();
                    $scope.telaCheia = false;

                }
            }
        }

        // FIM DO TRATAMENTO 



        $scope.showCapa = true;
        $scope.showExpiredModal = 0;
        $scope.Title = '...'; //trunk
        $scope.TextoVenda = '';
        $scope.lastPage = '';
        $scope.statusTributoAproximado = false;
        $scope.showPendingInvoices = false;
        $scope.onPendingInvoicesClose = null;
        $scope.beepProduto = false;


        $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {
            $scope.lastPage = from.name;
        });

        $scope.environment = {
            perfil: {},
            sideNav: {
                ativo: false,
                toggle: function () {
                    $scope.environment.sideNav.ativo = !$scope.environment.sideNav.ativo;
                },
            },
            currentState: {},
        };
        $scope.login = {
            login: '',
            chaveAcesso: '',
            manterConectado: false,
            carregando: false,
        };
        $scope.licenciamento = {
            licenciar: false,
            mensagem: '',
            newLicenca: '',
        };
        var allowedTerminal = ["PREVENDA", "CONSULTA", "CADCLIENTE"];
        var pages = [
            { cod: "PREVENDA", page: "state-venda-add" },
            { cod: "CONSULTA", page: "state-consulta" },
            { cod: "CONSULTA", page: "state-produto" },
            { cod: "CONSULTA", page: "state-produto-detail" },
            { cod: "CONSULTA", page: "state-produto-gerente" },
            { cod: "CADCLIENTE", page: "state-cliente-detail" },
            { cod: "CADCLIENTE", page: "state-cliente-add" },
            { cod: "CADCLIENTE", page: "state-cliente-edit" },
            { cod: "CADCLIENTE", page: "state-cliente" },
        ];
        var allowedTerminalPage = [];
        $scope.menu = {};
        $scope.tools = tools;
        $scope.toastr = toastr;
        $scope.confirm = $confirm;
        $scope.cacheVersion = {
            get: function () {
                var val = parseInt(localStorage.getItem('cacheVersion'));
                if (!val) val = 0;
                return val;
            },
            setNew: function () {
                var val = $scope.cacheVersion.get() + 1;
                localStorage.setItem('cacheVersion', val);
                return val;
            }
        };
        $scope.autorizacaoGerente = {
            callback: null,
            chave: '',
            pin: '',
            request: '',
            reason: '',
            carregando: false,
            ativo: false,
            MotivoPreDeterminado: '',
            showReason: true,
            showMotivoPreDeterminado: false
        }
        $scope.MotivosCancelamento = [];
        $scope.GetMotivosCancelamento = function(){
            securityService
                        .GetAllMotivos()
                        .then(
                        function (response) {
                            if (response.Status < 0)
                                console.error('Identidade do Usuário', response.Message);
                            else
                                $scope.MotivosCancelamento = response.Data;
                        },
                        function (error) { $scope.toastr.error(error, 'Sem comunicação com o servidor'); });
        }
        $scope.initialize = function () {
            $scope.onPendingInvoicesClose = null;
            $scope.getConfig();
            $scope.getProfile();
            $scope.checkLicenca();
            $scope.checkstatusTributoAproximado();
        };

        $scope.setPages = function () {

            if ($scope.config.Terminal.TiposTerminal) {
                for (var i = 0; i < $scope.config.Terminal.TiposTerminal.length; i++) {

                    var hasAuthorization = $.grep(pages, function (item) {
                        return item.cod == $scope.config.Terminal.TiposTerminal[i].Cod.toUpperCase();
                    });

                    if (hasAuthorization && hasAuthorization.length > 0) {
                        allowedTerminalPage = allowedTerminalPage.concat(hasAuthorization);
                    }

                }
            }
        };


        $scope.initializeLayout = function (title) {

         
            $scope.Title = title;
            $scope.environment.currentState = $state;
            $scope.login.carregando = false;
            $scope.getTextoVenda();
            $scope.GetMotivosCancelamento();
        }

        $scope.setMenu = function () {
            $scope.menu = {
                principais: [
                    //{ titulo: 'Capa', materialIcon: 'home', state: 'state-home', descricao: 'Tela principal e inicial do sistema.', allowed: $scope.checkProfile() },
                    { titulo: 'Dashboard', materialIcon: 'dashboard', state: 'state-dashboard', descricao: 'Painel de visualização de indicadores para o vendedor e/ou caixa.', allowed: $scope.checkProfile() },
                    { titulo: 'Vendas', materialIcon: 'shopping_basket', state: 'state-venda', descricao: 'Lista de vendas efetuadas pela loja.', allowed: $scope.checkProfile() },
                    { titulo: 'Clientes', materialIcon: 'account_circle', state: 'state-cliente', descricao: 'Lista de consumidores cadastrados na empresa.', allowed: $scope.config.AbreClientes && $scope.checkProfile() },
                    { titulo: 'Produtos', materialIcon: 'widgets', state: 'state-produto', descricao: 'Lista de produtos ofertados pela empresa.', allowed: $scope.config.AbreEstoque && $scope.checkProfile(), visibleEstoquista: true },
                    { titulo: 'Consulta', materialIcon: 'select_all', state: 'state-consulta', descricao: 'Consulta rápida de preços e estoques de produtos.', allowed: $scope.config.AbreConsulta && $scope.checkProfile(), visibleEstoquista: true },
                    { titulo: 'Meu Acesso', materialIcon: 'lock_outline', state: 'state-usuario-detail', descricao: 'Alteração de senha.', allowed: true },
                ],
                gestao: [
                    { titulo: 'Gestão', materialIcon: 'equalizer', state: 'state-gestao', descricao: 'Menu para os gestores da loja.', visibleEstoquista: true },
                    { titulo: 'Acessos', materialIcon: 'lock_outline', state: 'state-usuario', descricao: 'Alteração de senha.', allowed: $scope.config.Vendedor.IndicaGerente },
                ]
            };



        };
        $scope.getConfig = function (success) {
            configService
                .get(true)
                .then(
                function (response) {
                    if (response.Status < 0)
                        $scope.toastr.error(message, 'Serviço');
                    else {
                        $scope.config = response.Data;
                        $scope.checkCaixaAberto($scope.config.Terminal.Codigo);
                        $scope.setMenu();
                        if (success)
                            success();
                        $scope.setPages();
                    }
                },
                function (error) { $scope.toastr.error(error, "Serviço"); }
                );
        };
        $scope.getProfile = function () {
            securityService
                .getIdentityInfo()
                .then(
                function (response) {
                    if (response.Status < 0)
                        console.error('Identidade do Usuário', response.Message);
                    else
                        $scope.environment.perfil = response.Data;
                },
                function (error) { $scope.toastr.error(error, 'Sem comunicação com o servidor'); });
        };
        $scope.signIn = function () {
             
            if (!$scope.login.login || !$scope.login.chaveAcesso)
                return false;

            $scope.licenciamento.mensagem = '';
            $scope.login.carregando = true;
            debugger
            securityService
                .signIn($scope.login.login, $scope.login.chaveAcesso, $scope.login.manterConectado)
                .then(
                    function (response) {
                    if (response.Status == -2) { //licenca expirada ou inválida
                        $scope.licenciamento.licenciar = true;
                        $scope.licenciamento.mensagem = response.Message;
                        $scope.login.carregando = false;
                    } else if (response.Status == -1) { //erro
                        $scope.toastr.error(response.Message, 'Login de Acesso');
                        $scope.login.carregando = false;
                    } else { //credenciais ok
                        $scope.environment.perfil = response.Data;
                        $state.go('state-home', {}, { reload: true, location: 'replace' });
                        $scope.getConfig();
                        $scope.login.chaveAcesso = '';
                        if ($scope.config.ApresentarNotasPendentes) {
                            $scope.showPendingInvoices = true;
                        }
                        if (response.Status == 1) {
                            $scope.toastr.info(reponse.Message);
                        }

                        licencaService.exibirLicenca();
                        $scope.checkLicenca();
                        $scope.avisoLicenca();
                    }
                },
                    function (error) {
                    $scope.toastr.error(error, 'Comunicação com o servidor.');
                    $scope.login.carregando = false;
                }
                );
        }
        $scope.signOut = function () {
            securityService
                .signOut()
                .then(
                function () {
                    $scope.toastr.info('Efetuando log-off...');
                    $scope.environment.perfil = {};
                    $state.go('state-login', {}, { reload: true, location: 'replace' });
                    $scope.environment.sideNav.ativo = false;
                    licencaService.suprimirLicenca();
                    licencaService.destruirLicenca();
                    $scope.avisoLicenca();
                    $scope.toastr.clear();
                    localStorage.removeItem('statusTributo');
                },
                function (error) { $scope.toastr.error(error, 'Sem comunicação com o servidor'); });
        };
        $scope.verifySignOut = function () {
            if ($scope.config.ApresentarNotasPendentes && $scope.config.UsaPOS) {
                $scope.showPendingInvoices = true;
                $scope.onPendingInvoicesClose = $scope.signOut;
            }
            else {
                $scope.showPendingInvoices = false;
                $scope.onPendingInvoicesClose = null;
                $scope.signOut();
            }
        }
        $scope.saveLicenca = function () {
            $scope.login.carregando = true;
            securityService
                .saveLicenca($scope.licenciamento.newLicenca)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        console.error(response.Exception);
                    }
                    else {
                        licencaService.suprimirLicenca();
                        $scope.initialize();
                    }
                    $scope.login.carregando = false;
                },
                function (error) {
                    $scope.toastr.error(error, 'Comunicação com o servidor.');
                    $scope.login.carregando = false;
                }
                );
        };
        $scope.toggleExpiredModal = function () {
            $scope.showExpiredModal = 0;
        }
        $scope.checkLicenca = function () {
            $scope.licenciamento.message = '';
            securityService
                .checkLicenca()
                .then(
                function (response) {
                    if (response.Status == -2) {
                        $scope.licenciamento.licenciar = true;
                        $scope.licenciamento.message = response.Message;
                        console.error(response.Exception);
                        licencaService.setarLicenca(response.Status, response.Message);
                        $timeout(function () { $('[ng-model*="licenciamento.newLicenca"]').focus(); });
                    } else if (response.Status == 1) {
                        $scope.licenciamento.licenciar = false;
                        console.error(response.Exception);
                        licencaService.setarLicenca(response.Status, response.Message);
                        if (response.Exception.InnerException.HelpURL == "1")
                            licencaService.setarLicenca(response.Status, response.Message, "");
                        else
                            licencaService.setarLicenca(response.Status, response.Message, response.Message);
                        $scope.licenca = licencaService.mensagemLicenca();
                        $confirmModalDefaults.defaultLabels.title = "Atenção!";
                        $confirm({ text: $scope.licenca.mensagem + ". Entre em contato com o suporte através do email:suporte@b2usistemas.com.br e solicite uma nova licença." })
                    } else {
                        $scope.licenciamento.licenciar = false;
                        licencaService.setarLicenca(response.Status, response.Message);
                        if (!response.Message)
                            licencaService.setarLicenca(response.Status, "");
                    }
                    $scope.avisoLicenca();
                },
                function (error) {
                    $scope.toastr.error('Ao iniciar', 'Comunicação com o servidor');
                    console.error(error);
                }
                );
        };
        $scope.avisoLicenca = function () {
            $("#mensagem-expirada").attr("style", "block");
            $scope.licenca = licencaService.mensagemLicenca();
            if (!$scope.licenca)
                return 1;
            return $scope.licenca.status;
        }

        $scope.returnAuthorization = function () {
            if ($scope.autorizacaoGerente.callbackReturn)
                $scope.autorizacaoGerente.callbackReturn();
            $scope.toggleAutorizacaoGerente();
            $scope.autorizacaoGerente.showMotivoPreDeterminado = false;
        }

        $scope.getAutorizacaoGerente = function () {
            
            if ( $scope.config.SolicitaMotivoPreDefinido && $scope.autorizacaoGerente.showMotivoPreDeterminado && ($scope.autorizacaoGerente.MotivoPreDeterminado == null || $scope.autorizacaoGerente.MotivoPreDeterminado == ''))
            {
                $scope.toastr.error('Escolha um motivo da lista', 'Autorização de Gerente');
                return;
            }
            else
            {
                if (($scope.autorizacaoGerente.reason == null || $scope.autorizacaoGerente.reason == '') && $scope.autorizacaoGerente.showReason  && $scope.autorizacaoGerente.showMotivoPreDeterminado == false)
                {
                    $scope.toastr.error('Defina um motivo', 'Autorização de Gerente');
                    return;
                }

                if (($scope.autorizacaoGerente.reason == null || $scope.autorizacaoGerente.reason == '') && $scope.config.SolicitaMotivoPreDefinido == true && $scope.config.MotivoPadraoObrigatorio == true && $scope.autorizacaoGerente.showMotivoPreDeterminado == true && $scope.autorizacaoGerente.showReason)
                {
                    $scope.toastr.error('Defina um motivo', 'Autorização de Gerente');
                    return;
                }
            }
            $scope.autorizacaoGerente.carregando = true;
            securityService
                .getAutorizacao($scope.autorizacaoGerente.chave, $scope.autorizacaoGerente.pin, $scope.autorizacaoGerente.request, $scope.autorizacaoGerente.reason, $scope.autorizacaoGerente.MotivoPreDeterminado)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.toastr.error(response.Message, 'Autorização de Gerente');
                        console.error(response.Exception);
                        $scope.autorizacaoGerente.carregando = false;
                    } else {
                        $scope.autorizacaoGerente.showMotivoPreDeterminado = false;
                        $scope.autorizacaoGerente.data = response.Data;
                        if ($scope.autorizacaoGerente.callback)
                            $scope.autorizacaoGerente.callback();
                        $scope.autorizacaoGerente.pin = '';
                        $scope.autorizacaoGerente.request = '';
                        $scope.autorizacaoGerente.carregando = false;
                        $scope.toggleAutorizacaoGerente();
                        $timeout(function () { $scope.autorizacaoGerente.callback = null; });
                    }
                },
                function (error) {
                    $scope.toastr.error('Autorização de gerente', 'Comunicação com o servidor');
                    console.error(error);
                    $scope.autorizacaoGerente.carregando = true;
                });
        };
        $scope.toggleAutorizacaoGerente = function () {
            $scope.autorizacaoGerente.ativo = !$scope.autorizacaoGerente.ativo;
            if ($scope.autorizacaoGerente.ativo) {
                $scope.autorizacaoGerente.reason = "";
                $scope.autorizacaoGerente.pin = "";
            }
        };
        $scope.checkCaixaAberto = function (codigo) {
            if ($scope.login.login != '')
                caixaService
                    .checkCaixaAberto(codigo, null)
                    .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.toastr.error(response.Message, "Serviço");
                        else
                            $scope.caixaAberto = response.Data;
                    },
                    function (error) {

                        $scope.toastr.error(error, 'Serviço');
                    }
                    );
        }

        $scope.goTop = function () {
            $('body').animate({ scrollTop: 0 }, 300);
        };


        $scope.getTextoVenda = function () {

            pedidoService.ValidaVendaSuspensa().then
                (
                function (response) {
                    if (response.Status < 0) {
                        $scope.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        var isPreVendaTerminal = $scope.checkTerminal();
                        if (response.Data) {
                            
                            if ($scope.config.UsaPOS) {
                                $scope.TextoVenda = (isPreVendaTerminal ? "Retomar Pré-Venda" : "Retomar Venda");
                            }
                            else
                                $scope.TextoVenda = (isPreVendaTerminal ? "Retomar Pré-Pedido" : "Retomar Pedido");

                        }
                        else {
                            if ($scope.config.UsaPOS)
                                $scope.TextoVenda = (isPreVendaTerminal ? "Nova Pré-Venda" : "Nova Venda");
                            else
                                $scope.TextoVenda = (isPreVendaTerminal ? "Novo Pré-Pedido" : "Novo Pedido");
                        }
                    }
                }
                );
        }

        $scope.newOrder = function ($event) {
            if (!$scope.caixaAberto && $scope.config.NaoConverterPreVenda) {
                $event.preventDefault();
                $scope.toastr.error('Não é possível realizar uma nova venda com o caixa fechado.');
            }
        }

        $scope.TerminalConsulta = function () {
           
            for (var i = 0; i < $scope.config.Terminal.TiposTerminal.length; i++) {
                
                var cod = $scope.config.Terminal.TiposTerminal[i].Cod;
                if (cod == "Consulta")
                    return true
               
            }
            return false;
        }

        $scope.checkTerminal = function (relieve) {

            if (!$scope.config || !$scope.config.Terminal)
                return false;

            if ($scope.config.Terminal.TiposTerminal) {
                for (var i = 0; i < $scope.config.Terminal.TiposTerminal.length; i++) {
                    var cod = $scope.config.Terminal.TiposTerminal[i].Cod;

                    if (allowedTerminal.indexOf(cod.toUpperCase()) >= 0 && !checkRelieve(relieve))
                        return true;
                }
            }
            return false;
        }

        $scope.checkPageTerminal = function (page) {
            if ($scope.config) {
                if (!$scope.config.UsaPOS
                    &&
                    (
                        page == 'state-ticket-detail'
                        || page == 'state-entrada'
                        || page == 'state-entrada-add'
                        || page == 'state-entrada-detail'
                        || page == 'state-entrada-edit'
                        || page == 'state-saida'
                        || page == 'state-saida-add'
                        || page == 'state-saida-detail'
                        || page == 'state-saida-edit'
                        || page == 'state-consumivel'
                        || page == 'state-consumivel-add'
                        || page == 'state-consumivel-edit'
                        || page == 'state-nota-fiscal'
                        || page == 'state-nota-fiscal-detail'
                    )
                ) {
                    return false;
                }
                if ((page == 'state-venda-por-vendedor-gestao' || page == 'state-consolidado-vendedor') && $scope.config.MostraRelVendedor)
                    return true;
                if (page == 'state-home' || page == 'state-login' || page == 'state-config' || allowedTerminalPage.length == 0)
                    return true;
                for (var i = 0; i < allowedTerminalPage.length; i++) {
                    if (allowedTerminalPage[i].page == page)
                        return true
                }
                return false;
            }
            else
                return false;
        }

        $scope.checkProfile = function () {

               if (!angular.isUndefined($scope.config)
                && !$scope.config.RestricoesPerfilUsuario) {
                return true;
            }
            else {
                   if ($scope.environment.perfil.IndicaGerente) {
                    return true;
                }
                else {
                    return false;
                }
            }
        }

        $scope.checkProfileNotEstoquista = function () {
           
            // se o usuario for estoquista, utiliza esse metodo para sumir com as coisas que não fazem parte dessa condição "opera_caixa e gerente como 0 e o acesso_gerencial como 1"
            if($scope.environment.perfil.IndicaGerente && !$scope.environment.perfil.IndicaOperador && !$scope.environment.perfil.IndicaEspecial)
                return false
            else
                return true
            };

        var checkRelieve = function (relieve) {
            if (!relieve || !$scope.config || !$scope.config.Terminal)
                return false;

            if ($scope.config.Terminal.TiposTerminal) {
                for (var i = 0; i < $scope.config.Terminal.TiposTerminal.length; i++) {
                    var cod = $scope.config.Terminal.TiposTerminal[i].Cod;
                    if (cod == relieve) {
                        return true;
                    }
                }
            }

            return false;
        }

        $scope.historyBack = function () {
           
            if ($scope.lastPage != "")
                $window.history.back();
            else
                $state.go('state-home');
        }

        $scope.checkstatusTributoAproximado = function () {


            var statusTributo = localStorage.getItem("statusTributo");

            if (angular.isUndefined(statusTributo) || statusTributo == null) {
                notaFiscalComplementarService.getStatusImposto().then(function (response) {
                    if (!angular.isUndefined(response) && !angular.isUndefined(response.Data) && response.Data) {
                        $scope.statusTributoAproximado = true;
                    }
                });
            }

        }

        $scope.closeModalTributoAproximado = function () {

            $scope.statusTributoAproximado = false;
            localStorage.setItem("statusTributo", true);
        }

        $scope.initialize();
    }
})();