(function () {
    'use strict';

    angular
        .module('editorRotas')
        .factory('atalhos', atalhos);

    atalhos.$inject = ['FuncionalidadesMapa', '$rootScope', 'ferramentaApagarTrecho', 'ferramentaAjustarTrecho', 'ferramentaContinuarItinerario', 'ferramentaMedirDistancia',
        'ferramentaInicioFimColeta', 'ferramentaPacmans', 'ferramentaClassificarTrechos', 'ferramentaImportarHistorico'];

    function atalhos(FuncionalidadesMapa, $rootScope, ferramentaApagarTrecho, ferramentaAjustarTrecho, ferramentaContinuarItinerario, ferramentaMedirDistancia,
        ferramentaInicioFimColeta, ferramentaPacmans, ferramentaClassificarTrechos, ferramentaImportarHistorico) {

        var _atalhosAtivo = true;
        var _scope = null;

        function init() {
            google.maps.event.addDomListener(document, "keyup", (event) => { onKeyDown(event); return; });
        }

        function onKeyDown(e) {
            if (!_atalhosAtivo) return;

            _scope.vm.clearToolbar();

            var key = e.which ? e.which : e.keyCode;
            //$rootScope.ajustar = false;
            if (!ferramentaApagarTrecho.IsHabilitado()) {
                $rootScope.borracha = false;
                $rootScope.borrachaSimples = false;
            }
            $rootScope.$apply();
            switch (key) {
                case 32://space
                    if (_scope.vm.permissions.indexOf('ajustarTrecho') >= 0) {
                        if (FuncionalidadesMapa.IsMultiSelecao() || FuncionalidadesMapa.IsMultiUnificacao()) {

                            ferramentaApagarTrecho.Desabilita();
                            ferramentaAjustarTrecho.Habilita("Unificar");
                            ferramentaAjustarTrecho.UnificarTrecho();

                            _scope.vm.RotaObservable.notify('enable');
                            $rootScope.$apply();
                        }
                    }
                    break;
                // navegar para frente
                case 38: // seta para cima
                case 39: // seta para direita

                    if (FuncionalidadesMapa.HasSelecionarTrecho()) {

                        FuncionalidadesMapa.navegarFrente(e.shiftKey);

                        if (FuncionalidadesMapa.IsMultiSelecao())
                            ferramentaAjustarTrecho.Habilita("Selecionar");
                        else
                            ferramentaAjustarTrecho.Desabilita();
                    }
                    break;
                // navegar para trás
                case 37: // seta para esquerda
                case 40: // seta para baixo

                    if (FuncionalidadesMapa.HasSelecionarTrecho()) {

                        FuncionalidadesMapa.navegarTras(e.shiftKey);

                        if (FuncionalidadesMapa.IsMultiSelecao())
                            ferramentaAjustarTrecho.Habilita("Selecionar");
                        else
                            ferramentaAjustarTrecho.Desabilita();
                    }
                    break;
                case 68: // 'D'

                    if (e.shiftKey) {
                        if (_scope.vm.permissions.indexOf('continuarItinerario') >= 0) {

                            limpaFerramentasAtivas();

                            if (!ferramentaContinuarItinerario.IsHabilitado())
                                ferramentaContinuarItinerario.Habilita();
                        }
                    } else {
                        if (_scope.vm.permissions.indexOf('classificarTrechos') >= 0) {
                            ferramentaClassificarTrechos.classificar('D', FuncionalidadesMapa.GetArrayPathPolylineHighlight());
                            if (!ferramentaClassificarTrechos.IsHabilitado()) ferramentaClassificarTrechos.Habilita('D');
                            else ferramentaClassificarTrechos.Habilita('D', true);
                            $rootScope.$apply();
                        }
                    }
                    break;
                case 73: // 'I'
                    if (e.shiftKey && _scope.vm.permissions.indexOf('inicioFimColeta') >= 0) {
                        limpaFerramentasAtivas();
                        ferramentaInicioFimColeta.SetCenterInicioFim(true);
                        ferramentaInicioFimColeta.Habilita();
                    }
                    break;
                case 70: // 'F'
                    if (e.shiftKey && _scope.vm.permissions.indexOf('inicioFimColeta') >= 0) {
                        limpaFerramentasAtivas();
                        ferramentaInicioFimColeta.SetCenterInicioFim(false);
                        ferramentaInicioFimColeta.Habilita();
                    }
                    break;
                case 67: // 'C'
                    if (_scope.vm.permissions.indexOf('classificarTrechos') >= 0) {
                        ferramentaClassificarTrechos.classificar('C', FuncionalidadesMapa.GetArrayPathPolylineHighlight());
                        if (!ferramentaClassificarTrechos.IsHabilitado()) ferramentaClassificarTrechos.Habilita('C');
                        else ferramentaClassificarTrechos.Habilita('C', true);
                        _scope.vm.RotaObservable.notify('enable');
                        $rootScope.$apply();
                    }
                    break;
                case 77: // 'M'
                    if (_scope.vm.permissions.indexOf('classificarTrechos') >= 0) {
                        ferramentaClassificarTrechos.classificar('M', FuncionalidadesMapa.GetArrayPathPolylineHighlight());
                        if (!ferramentaClassificarTrechos.IsHabilitado()) ferramentaClassificarTrechos.Habilita('M');
                        else ferramentaClassificarTrechos.Habilita('M', true);
                        _scope.vm.RotaObservable.notify('enable');
                        $rootScope.$apply();
                    }
                    break;
                case 82: // 'R'
                    if (_scope.vm.permissions.indexOf('medirDistancia') >= 0) {
                        if (e.shiftKey) ferramentaMedirDistancia.Limpar();
                        else {
                            ferramentaContinuarItinerario.Desabilita();
                            if (!ferramentaMedirDistancia.IsHabilitado()) {

                                ferramentaMedirDistancia.Habilita();

                                if (_scope && _scope.Borracha) {
                                    ferramentaApagarTrecho.ApagarPolygonApagarTrecho();
                                    _scope.Borracha = false;
                                }
                            }
                            else limpaFerramentasAtivas(true, true);
                        }
                    }
                    break;
                case 27: // 'Esc'
                    limpaFerramentasAtivas(true, true);
                    break;
                case 65: case 46: // 'A', 'DEL'
                    if (_scope.vm.permissions.indexOf('apagarTrecho') >= 0) {
                        if (ferramentaApagarTrecho.IsHabilitado()) ferramentaApagarTrecho.ApagarPolygonApagarTrecho();
                        limpaFerramentasAtivas();
                        if (e.shiftKey) {
                            $rootScope.borracha = true;
                            ferramentaApagarTrecho.Habilita($rootScope.borracha);
                        } else {
                            $rootScope.borrachaSimples = true;
                            ferramentaApagarTrecho.Habilita();

                            if (FuncionalidadesMapa.HasSelecionarTrecho()) {
                                ferramentaApagarTrecho.ApagarTrechoSelecao();
                                _scope.vm.RotaObservable.notify('enable');
                            }
                        }
                        $rootScope.$apply();
                    }
                    break;
                case 66: // 'B'
                    if (e.shiftKey && _scope.vm.permissions.indexOf('apagarTrecho') >= 0) {
                        ferramentaApagarTrecho.Habilita(false);
                        _scope.vm.abrirModalApagarTodaRota();
                        _atalhosAtivo = false;
                        limpaFerramentasAtivas(true);
                    }
                    break;
                case 80: // 'P'
                    if (_scope && _scope.vm.informacoesRotaAtual.Ativo !== 'T' && _scope.vm.permissions.indexOf('pacmans') >= 0) {
                        limpaFerramentasAtivas();
                        if (e.shiftKey) ferramentaPacmans.AtivarTodos();
                        else if (e.altKey) ferramentaPacmans.DesativarTodos();
                        else ferramentaPacmans.OnOffPacman();

                        $rootScope.$apply();
                    }
                    break;
                case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105:// '1', '2', '3', '4', '5', '6', '7', '8', '9'
                    if (e.altKey && _scope.vm.permissions.indexOf('ajustarTrecho') >= 0) {

                        limpaFerramentasAtivas();
                        ferramentaAjustarTrecho.Habilita("Segmentar");
                        var quantidadeSegmentos = 0;

                        switch (e.keyCode) {
                            case 97: quantidadeSegmentos = 2; break;
                            case 98: quantidadeSegmentos = 3; break;
                            case 99: quantidadeSegmentos = 4; break;
                            case 100: quantidadeSegmentos = 5; break;
                            case 101: quantidadeSegmentos = 6; break;
                            case 102: quantidadeSegmentos = 7; break;
                            case 103: quantidadeSegmentos = 8; break;
                            case 104: quantidadeSegmentos = 9; break;
                            case 105: quantidadeSegmentos = 10; break;
                            default:
                                quantidadeSegmentos = String.fromCharCode(e.keyCode);
                                quantidadeSegmentos++;
                        }

                        ferramentaAjustarTrecho.SegmentarTrecho(quantidadeSegmentos);
                    }
                    break;
                case 90:// 'Z'
                    if (e.shiftKey && _scope.vm.voltarAcao) {
                        if (_scope.vm.undo)
                            ferramentaApagarTrecho.Undo();
                    }
                    break;
                case 89:// 'Y'
                    if (e.shiftKey && _scope.vm.voltarAcao) {
                        if (!_scope.vm.undo)
                            ferramentaApagarTrecho.Redo();
                    }
                    break;
                default:
                    break;
            }
        }

        function limpaFerramentasAtivas(tipo, apagarTrecho = false) {
            $rootScope.borracha = false;

            if (_scope && _scope.Borracha) {
                ferramentaApagarTrecho.ApagarPolygonApagarTrecho();
                _scope.Borracha = false;
            }

            $rootScope.borrachaSimples = false;

            if (_scope && _scope.vm.voltarAcao) _scope.vm.voltarAcao = false;

            $rootScope.$apply();

            ferramentaContinuarItinerario.Desabilita();
            ferramentaMedirDistancia.Desabilita();
            ferramentaAjustarTrecho.Desabilita();
            ferramentaInicioFimColeta.Desabilita();
            ferramentaPacmans.Desabilita();

            if (apagarTrecho) ferramentaApagarTrecho.Desabilita();

            if (tipo) FuncionalidadesMapa.LimparSelecionarTrecho(true);

            ferramentaImportarHistorico.LimparHistoricosImportados();
        }

        return {
            Init: init,
            SetScope: (scope) => _scope = scope,
            Habilita: (habilita) => _atalhosAtivo = habilita,
        };
    }
})();
