Source: directives/alarme-disparado/alarme-disparado.js

    /**
     * @ngdoc directives
     * @name alarme-disparado
     * @module s4c.directives.alarme-disparado
     *
     * @description
     * `AlarmeDisparadoController` Responsável por exibir as funções do alarme na tela, bem como o seu funcionamento.
     * 
     *
     */

(function () {
    'use strict';

    angular.module('s4c.directives.alarme-disparado', [
        's4c.services',
        's4c.components.detalhamento',

        'angularMoment',
        'angular-toasty'
    ])
        .directive('s4cAlarmeDisparado', AlarmeDisparado);

    function AlarmeDisparado() {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/alarme-disparado/alarme-disparado.html',
            replace: true,
            //scope: {},
            controller: AlarmeDisparadoController
        }
    }

    AlarmeDisparadoController.$inject = [
        '$scope',
        'MainState',
        'AlarmeDisparado',
        'Alarme',
        '$mdDialog',
        'DetalhamentoService',
        'CommService',
        'MensageriaService',
        'toasty',
        'CamadasService',
        'IncidentesManager',
        'TarefaManager',
        'MapaManager',
        'AuthService',
        '$rootScope',
        'ZonasDeObservacaoFilter',
        'MapaService',
        'DetalhamentoManager'
    ];

    function AlarmeDisparadoController($scope, MainState, AlarmeDisparado, Alarme, $mdDialog, DetalhamentoService,
        CommService, MensageriaService, toasty, CamadasService, IncidentesManager, TarefaManager, MapaManager, AuthService,
        $rootScope, ZonasDeObservacaoFilter, MapaService, DetalhamentoManager) {

        $scope.res = $scope.$root.res;

        var iconesAlarme = {
            'Incidente': 'assets/images/Incidentes/ic_incidente_color_24px-01.png',
            'Twitter': 'assets/images/Alarme/ic_twitter_color_24px-01.png',
            'Categoria': 'assets/images/Alarme/ic_alarme_color_24px.png',
            'IncidenteZO': 'assets/images/Alarme/ic_zona_observacao_color_24px-01.png',
            'TempoZO': 'assets/images/Alarme/ic_zona_observacao_color_24px-01.png',
            'TwitterZO': 'assets/images/Alarme/ic_zona_observacao_color_24px-01.png',
            'Planejamento': 'assets/images/Planejamento/ic_planejamento_color_24px.png',
            'AtivarCamadaZO': 'assets/images/Planejamento/ic_planejamento_color_24px.png',
            'CercaVirtualEntradaZO': 'assets/images/Planejamento/ic_planejamento_color_24px.png',
            'CercaVirtualSaidaZO': 'assets/images/Planejamento/ic_planejamento_color_24px.png',
            'CercaVirtualPermanenciaZO': 'assets/images/Planejamento/ic_planejamento_color_24px.png',
            'default': 'assets/images/Alarme/ic_alarme_color_24px.png'
        };

        var tipos = {
            'Planejamento': $scope.res('PLANEJAMENTO_TITULO'),
            'Twitter': 'Twitter',
            'TwitterZO': $scope.res('ZONAOBSERVACAO_TITULO'),
            'Incidente': $scope.res('MSI_NOME'),
            'IncidenteZO': $scope.res('ZONAOBSERVACAO_TITULO'),
            'TempoZO': $scope.res('ZONAOBSERVACAO_TITULO'),
            'Categoria': $scope.res('Categoria'),
            'Mensagem': $scope.res('AUDITORIA_MENSAGEM'),
            'Briefing': 'Briefing',
            'Mensageria': 'Telegram',
            'MensagemGrupoMensageriaExterna': $scope.res('MENSAGEM_EXTERNA'),
            'AtivarCamadaZO': $scope.res('ZONAOBSERVACAO_TITULO'),
            'CercaVirtualEntradaZO': $scope.res('CERCA_VIRTUAL_ENTRADA'),
            'CercaVirtualSaidaZO': $scope.res('CERCA_VIRTUAL_SAIDA'),
            'CercaVirtualPermanenciaZO': $scope.res('CERCA_VIRTUAL_PERMANENCIA')
        };

        //Controle de exibição de alarmes de até uma semana.
        $scope.verMais = false;

        angular.extend($scope, {
            exibindoMeusAlarmes: false,
            alarmesDisparados: [],
            alarmes: [],
            exibirCheckbox: exibirCheckbox,
            exibirIcone: exibirIcone,
            mudarStatusVerificado: mudarStatusVerificado,
            exibirMeusAlertas: exibirMeusAlertas,
            esconderMeusAlertas: esconderMeusAlertas,
            obterMensagem: obterMensagem,
            acaoAlarmeDisparado: acaoAlarmeDisparado,
            acaoAlarmeConfigurado: acaoAlarmeConfigurado,
            removerAlarme: removerAlarme,
            verificar: verificar
        });

        MainState.registerDirective('alarmeDisparado', $scope.$api);

        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('alarmeDisparado');
        });



 	  /**
        * Obtêm os alarmes do usuário
        *
        * @method _obterMeusAlarmes
        * 
        * 
        */
        function _obterMeusAlarmes() {
            AlarmeDisparado
                .obterMeusAlarmesDisparados(AuthService.user.info.id)
                .then(function (alarmesDisparados) {

                    var startDate = moment();

                    _.each(alarmesDisparados, function (alarme) {
                        if (moment(alarme.data).isBefore(startDate, 'day')) {
                            alarme.dentroDaSemana = true;
                        }
                    });


                    var alarmesPorTipo = _.transform(alarmesDisparados, function (result, next) {
                        next.titulo = moment(next.data).format('DD/MM/YYYY [às] HH:mm');

                        if (next.tituloMensagem != null) {
                            next.tituloMensagem = next.tituloMensagem.toUpperCase();
                        }

                        var tipo = _.find(result, {
                            nome: tipos[next.tipo]
                        });

                        if (tipo) {
                            tipo.alarmes.push(next);
                        } else {
                            result.push({
                                nome: tipos[next.tipo],
                                tipo: next.tipo,
                                alarmes: [next]
                            });

                        }
                    }, []);

                    $scope.alarmesPorTipo = alarmesPorTipo;
                });

        }
        
       /**
        * Obtêm os alarmes configurados do usuário
        *
        * @method _obterAlarmesConfigurados
        * 
        * 
        */
        function _obterAlarmesConfigurados() {
            Alarme
                .query()
                .then(function (alarmes) {

                    _.each(alarmes, function (alarme) {
                        alarme.icone = iconesAlarme[alarme.tipo] || iconesAlarme.default;
                        alarme.tipo = tipos[alarme.tipo];
                    })

                    $scope.alarmes = alarmes;
                });
        }

        // Deprecated function to fix issue #273
        function _exibirToast(mensagem, clickFn) {
            clickFn();
            /*
            toasty({
                msg: mensagem,
                onClick: clickFn
            });*/
        }

        CommService.on('alarmes', _obterMeusAlarmes);

        CommService.on('BRIEFING_START', function (parametros) {

            toasty({
                title: parametros.nome,
                msg: $scope.res('BRIEFING_START') + ' ' + parametros.valor + ' '
                    + (parametros.unidade.contains('min') ? $scope.res('COMUM_MINUTO_OR_MINUTOS') : $cope.res("COMUM_HORA_OR_HORAS")),
                html: true
            });
        });

        _obterMeusAlarmes();

        ZonasDeObservacaoFilter.getInstance('zonas-de-observacao-filter').on('alarmesConfigurados', function () {
            _obterAlarmesConfigurados();
        });

       /**
        * Exibe checkbox do alarme disparado
        *
        * @method exibirCheckbox
        * 
        * 
        */
        function exibirCheckbox(alarmeDisparado) {
            alarmeDisparado.exibirCheckbox = true;
        }

       /**
        * Exibe ícone do alarme disparado
        *
        * @method exibirIcone
        * 
        * 
        */
        function exibirIcone(alarmeDisparado) {
            alarmeDisparado.exibirCheckbox = false;
        }

       /**
        * Exibe os alertas
        *
        * @method exibirMeusAlertas
        * 
        * 
        */
        function exibirMeusAlertas() {
            $scope.exibindoMeusAlarmes = true;
        }

       /**
        * Esconde os alertas
        *
        * @method esconderMeusAlertas
        * 
        * 
        */
        function esconderMeusAlertas() {
            $scope.exibindoMeusAlarmes = false;
        }


       /**
        * Muda o status de verficação do alarme
        *
        * @method mudarStatusVerificado
        * 
        * 
        */
        function mudarStatusVerificado(alarmeDisparado, element) {
            AlarmeDisparado
                .mudarStatusVerficado(alarmeDisparado.id, alarmeDisparado.verificado)
                .then(angular.noop, function (err) {
                    alarmeDisparado.verificado = !alarmeDisparado.verificado
                    $mdDialog.show(
                        $mdDialog.alert()
                            .parent(element)
                            .title('Erro')
                            .content(err)
                            .ariaLabel(err)
                            .ok('Ok')
                    );
                });
        }

       /**
        * Obtem a mensagem passada no alarme
        *
        * @method obterMensagem
        * @param alarme {Object} alarme
        * 
        */
        function obterMensagem(alarme) {

            if (!alarme.detalhes) {
                return '';
            }

            var mensagens = {
                'Twitter': alarme.detalhes.palavraChave,
                'TwitterZO': alarme.detalhes.palavraChave,
                'TempoZO': alarme.detalhes.mensagem,
                'AtivarCamadaZO': alarme.detalhes.mensagem
            };

            return mensagens[alarme.tipo];
        }

       /**
        * Executa uma ação baseada nas informações do alarme
        *
        * @method acaoAlarmeDisparado
        * @param alarmeDisparado {Object} alarmeDisparado
        * 
        */
        function acaoAlarmeDisparado(alarmeDisparado) {
            var click = function () { };

            if (alarmeDisparado.tipo == "Briefing") {
                click = function () {

                };
            }

            $("#central_de_alarmes").click();

            var acoesExternas = {
                'abrirPoi': function (chave_estrangeira) {
                    DetalhamentoService.pegarPoiPorChaveEstrangeira(chave_estrangeira).then(function (poi) {
                        var latlng = {
                            lat: poi.latitude,
                            lng: poi.longitude
                        };
                        DetalhamentoManager.abrirPoi(poi.id, latlng);
                        CamadasService.ativarMenuCategoria(poi.CategoriumId);
                        MapaService.voarPara([
                            poi.longitude,
                            poi.latitude
                        ]);
                        MapaService.piscarAzul(latlng);
                    });
                },
                'voarPara': function (coordenadas) {
                    MapaService.voarPara([
                        coordenadas.longitude,
                        coordenadas.latitude
                    ]);
                }
            }

            if (alarmeDisparado.acoes != null) {
                _.each(alarmeDisparado.acoes, function (acao) {
                    acoesExternas[acao.nome](acao.parametro)
                })
            }

            if (alarmeDisparado.ZonaObservacao) {
                click = function () {
                    CamadasService.exibirZonasDeObservacao();
                    MapaManager.voarParaObjeto(alarmeDisparado.ZonaObservacao);
                };
            }

            if (alarmeDisparado.Mensagem) {
                click = function () {
                    MensageriaService.abrirChat(alarmeDisparado.Mensagem.Usuario);
                };
            }

            if (alarmeDisparado.Incidente) {
                click = function () {
                    CamadasService.reloadIncidentes(true);
                    IncidentesManager.voarParaIncidente(alarmeDisparado.Incidente);
                    MapaManager.voarParaObjeto(alarmeDisparado.Incidente);
                };
            }

            if (alarmeDisparado.tipo === "Mensageria") {
                click = function () {

                    var confirm = $mdDialog.alert()
                        .title(alarmeDisparado.titulo + ':')
                        .content(alarmeDisparado.mensagem)
                        .ok('Fechar');

                    $mdDialog.show(confirm);

                    // REFACTOR:
                    var scope = angular.element($('#nspopover-1')).scope();
                    if (scope) {
                        scope.hidePopover();
                    }
                }
            }

            click();

            // Deprecated function _exibirToast to fix issue #273
            //_exibirToast(alarmeDisparado.mensagem, click);
        }


       /**
        * Executa uma ação baseada nas informações do alarme configurado
        *
        * @method acaoAlarmeConfigurado
        * @param alarme {Object} alarme
        * 
        */
        function acaoAlarmeConfigurado(alarme) {
            if (alarme.ZonaObservacao) {
                DetalhamentoService.abrirZonaDeObservacao(alarme.ZonaObservacao.id);
                if (alarme.detalhes.categoriaId) {
                    CamadasService.ativarMenuCategoria(alarme.detalhes.categoriaId);
                }
            } else {
                _exibirToast('Este alarme foi configurado na adminstração');
            }
        }

       /**
        * Remove o alarme
        *
        * @method removerAlarme
        * @param event {Object} event
        * @param alarmeDisparado {Object} alarmeDisparado
        * 
        */
        function removerAlarme(event, alarmeDisparado) {
            event.stopPropagation();
            alarmeDisparado.exibir = false;

            AlarmeDisparado.naoExibir(alarmeDisparado.id);
        }

       /**
        * Muda o status do alarme
        *
        * @method verificar
        * @param tipoAlarme {Object} tipoAlarme
        * 
        * 
        */
        function verificar(tipoAlarme) {

            _.each(tipoAlarme.alarmes, function (alarme) {
                if (!alarme.verificado) {
                    AlarmeDisparado.mudarStatusVerficado(alarme.id, true);
                }
            });
        }
    }
}());