Source: directives/ponto-movel/ponto_movel.js

/**
 * @ngdoc directives
 * @name PontoMovel
 * @module s4c.directives.pontoMovel.PontoMovel
 * 
 * @description `PontoMovel` exibe informações sobre um ponto de
 *              interesse
 * 
 * 
 * @example <s4c-ponto-movel> </s4c-ponto-movel>
 * 
 *
 */
(function () {
    'use strict';

    pontoMovelController.$inject = [
        '$scope',
        '$window',
        '$filter',
        '$anchorScroll',
        'ngTableParams',
        'MsiService',
        'MsiFilter',
        'CommService',
        'MainState',
        'DetalhamentoManager',
        'IncidentesManager',
        'MapaManager',
        'CamadasService',
        'localize',
        'Base',
        '$http',
        'API_ENDPOINT',
        '$mdDialog',
        'PontoMovelManager',
        'MapaService'
    ];

    function pontoMovelController(
        $scope,
        $window,
        $filter,
        $anchorScroll,
        ngTableParams,
        MsiService,
        MsiFilter,
        CommService,
        MainState,
        DetalhamentoManager,
        IncidentesManager,
        MapaManager,
        CamadasService,
        localize,
        Base,
        $http,
        API_ENDPOINT,
        $mdDialog,
        PontoMovelManager,
        MapaService) {

        $scope.res = $scope.$root.res;
        $scope.data = {};
        $scope.dispositivos = [];
        $scope.listERInfo = [];
        $scope.dados = {};
        $scope.start = getFiltroDataInicial();
        $scope.end = getFiltroDataFinal();
        $scope.posicaoAtualER = {};
        $scope.poiHidden = true;
        $scope.poisProximos = [];
        $scope.categoriasPoi = [];
        $scope.cameraHidden = true;
        $scope.camerasProximas = [];
        $scope.categoriasCamera = [];
        $scope.percursoHidden = true;

        /**
         * @method getFiltroDataInicial
         */
        function getFiltroDataInicial() {
            var dataAtual = new Date();
            dataAtual.setHours(0);
            dataAtual.setMinutes(0);

            return moment(dataAtual).format('DD/MM/YYYY HH:mm');
        }

        /**
         * @method getFiltroDataFinal
         */
        function getFiltroDataFinal() {
            var dataAtual = new Date();
            dataAtual.setHours(23);
            dataAtual.setMinutes(59);

            return moment(dataAtual).format('DD/MM/YYYY HH:mm');
        }

        /**
         * @method buscarPontoMovel
         * @param {*} id 
         * @param {*} ponto 
         */
        function buscarPontoMovel(id, ponto) {

            $http.get(API_ENDPOINT + "ponto_movel/" + id)
                .then(function (result) {
                    $scope.data = result.data;
                    $scope.posicaoAtualER = ponto;
                    buscarPosicoesER($scope.data.idElementoRastreavel);
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method buscarPontosMoveisPorTipo
         * @param {*} idTipoPontoMovel 
         */
        function buscarPontosMoveisPorTipo(idTipoPontoMovel) {

            removerLayers(idTipoPontoMovel);

            $http.get(API_ENDPOINT + "ponto_movel/tipo/" + idTipoPontoMovel)
                .then(function (result) {
                    var listPontosMoveis = result.data;

                    _.each(listPontosMoveis, function (pontoMovel) {
                        desenharPontoMovel(pontoMovel);
                    });
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method desenharPontoMovel
         * @param {*} pontoMovel 
         */
        function desenharPontoMovel(pontoMovel) {

            $http.post(API_ENDPOINT + "obterPosicaoAtualER", pontoMovel.idElementoRastreavel)
                .then(function (result) {

                    if (result == null || result == undefined) {
                        return;
                    }
                    var elementoRastreavelInfo = result.data;
                    var ponto = {
                        lat: elementoRastreavelInfo.latitude,
                        lng: elementoRastreavelInfo.longitude
                    };

                    MapaManager.desenharPontoMovel(pontoMovel, ponto);

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });

        }

        /**
         * @method buscarPosicoesER
         * @param {*} idElementoRastreavel 
         */
        function buscarPosicoesER(idElementoRastreavel) {
            $http.post(API_ENDPOINT + "obterPosicoesER", idElementoRastreavel)
                .then(function (result) {

                    $scope.listERInfo = result.data;
                    MapaManager.desenharERs($scope.listERInfo, $scope.posicaoAtualER, $scope.data);

                    _.each($scope.listERInfo, function (erInfo) {
                        $scope.dados[erInfo.dispositivoRastreamento.nome + '_hidden'] = true;
                    });

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method exibirDispositivo
         * @param {*} dispositivo 
         */
        function exibirDispositivo(dispositivo) {
            $scope.dados[dispositivo.nome + '_hidden'] = !$scope.dados[dispositivo.nome + '_hidden'];
        }

        /**
         * @method buscarPercurso
         */
        function buscarPercurso() {

        	/*if ($scope.dispositivoFiltro == null || $scope.dispositivoFiltro == undefined || $scope.dispositivoFiltro == ""){
        		$mdDialog
                .show($mdDialog.alert()
                    .title($scope.res('COMUM_AVISO'))
                    .content("Selecione o dispositivo que deseja visualizar o percurso")
                        .ok($scope.res('COMUM_OK')));
        		return;
        	}*/

            var parameterHistoricoPosicoesER = { idElementoRastreavel: $scope.data.idElementoRastreavel, startStr: $scope.start, endStr: $scope.end };

            $http.post(API_ENDPOINT + "obterHistoricoPosicoesER", parameterHistoricoPosicoesER)
                .then(function (result) {

                    var listHistoricoPosicoesER = result.data;
                    if (listHistoricoPosicoesER.length == 0) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_AVISO'))
                                .content("Nenhum percurso encontrado neste período")
                                .ok($scope.res('COMUM_OK')));
                        return;
                    }
                    if (listHistoricoPosicoesER.length > 450) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_AVISO'))
                                .content("A pesquisa retornou muitas informações, o que pode tornar a visualização lenta. Modifique o filtro.")
                                .ok($scope.res('COMUM_OK')));
                        return;
                    }
                    MapaManager.desenharPercursoER(listHistoricoPosicoesER, $scope.posicaoAtualER, $scope.data);

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method 
         * @param {*} idTipoPontoMovel 
         */
        function removerLayers(idTipoPontoMovel) {

            var layersToRemove = [];

            _.each(PontoMovelManager.layersPontoMovel.getLayers(), function (layer) {
                if (layer != undefined && layer.pontoMovel.tipo.id == idTipoPontoMovel) {
                    layersToRemove.push(layer);
                    PontoMovelManager.layersPontoMovel.removeLayer(layer);
                }
            });

            _.each(PontoMovelManager.subItens.getLayers(), function (layer) {
                if (layer != undefined && layer.pontoMovel.tipo.id == idTipoPontoMovel) {
                    layersToRemove.push(layer);
                    PontoMovelManager.subItens.removeLayer(layer);
                }
            });

            if (PontoMovelManager.layersPontoMovel.getLayers().length == 0) {
                MapaService.removerPoiClicado();
            }

            MapaService.removerLayers(layersToRemove);
        }

        /**
         * @method pegarPOIs
         */
        function pegarPOIs() {

            if ($scope.poiHidden) {

                $scope.categoriasPoi = [];

                $http.get(API_ENDPOINT + 'pois/proxima/' + $scope.posicaoAtualER.lat + '/' + $scope.posicaoAtualER.lng)
                    .then(function (res) {
                        $scope.poisProximos = res.data;
                        $scope.poisProximos = _.map($scope.poisProximos, function (poi) {

                            poi.tipo = 'poi';
                            var existeCategoria = false;

                            _.each($scope.categoriasPoi, function (categoriaPoi) {
                                if (categoriaPoi == poi.categoriaNome) {
                                    existeCategoria = true;
                                }
                            });

                            if (!existeCategoria) {
                                $scope.categoriasPoi.push(poi.categoriaNome);
                                $scope.dados[poi.categoriaNome + '_hidden'] = true;
                                $scope.dados[poi.categoriaNome + '_poisProximos'] = [];
                            }

                            $scope.dados[poi.categoriaNome + '_poisProximos'].push(poi);

                            return poi;
                        });
                    }, function (err) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content(err.data.message)
                                .ok($scope.res('COMUM_OK')));
                    });
            }

            $scope.poiHidden = !$scope.poiHidden;
        }

        /**
         * @method pegarCameras
         */
        function pegarCameras() {

            if ($scope.cameraHidden) {

                $scope.categoriasCamera = [];

                $http.get(API_ENDPOINT + 'cameras/proxima/' + $scope.posicaoAtualER.lat + '/' + $scope.posicaoAtualER.lng)
                    .then(function (res) {
                        $scope.camerasProximas = res.data;

                        MapaService.removerLinhas();

                        $scope.camerasProximas = _.map($scope.camerasProximas, function (camera) {
                            var existeCategoria = false;

                            _.each($scope.categoriasCamera, function (categoriaCamera) {
                                if (categoriaCamera == camera.categoriaNome) {
                                    existeCategoria = true;
                                }
                            });

                            if (!existeCategoria) {
                                $scope.categoriasCamera.push(camera.categoriaNome);
                                $scope.dados[camera.categoriaNome + '_hidden'] = true;
                                $scope.dados[camera.categoriaNome + '_camerasProximas'] = [];
                            }

                            $scope.dados[camera.categoriaNome + '_camerasProximas'].push(camera);

                            return camera;
                        });

                        if ($scope.camerasProximas.length > 0) {
                            _.chain($scope.camerasProximas)
                                .map('CategoriaCameraId')
                                .uniq()
                                .each(function (categoriaCameraId) {
                                    CamadasService.ativarMenuCategoriaCamera(categoriaCameraId);
                                })
                                .value();
                        }

                    }, function (err) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content(err.data.message)
                                .ok($scope.res('COMUM_OK')));
                    });
            }

            $scope.cameraHidden = !$scope.cameraHidden;
        }

        /**
         * @method exibirCategoria
         * @param {*} categoria 
         */
        function exibirCategoria(categoria) {
            $scope.dados[categoria + '_hidden'] = !$scope.dados[categoria + '_hidden'];
        }

        /**
         * @method voarParaSubItem
         * @param {*} obj 
         */
        function voarParaSubItem(obj) {
            PontoMovelManager.voarParaSubItem($scope.data, obj);
        }

        /**
         * @method updatePosicaoPontoMovel
         * @param {*} elementoRastreavelInfo
         */
        CommService.on('updatePosicaoPontoMovel', function (elementoRastreavelInfo) {
            console.log('Socket PontoMovel - updatePosicaoPontoMovel');
            MapaManager.atualizarPosicaoPontoMovel(elementoRastreavelInfo);
        });

        /**
         * @method notifyExtraPontoMovel
         * @param {*} elementoRastreavelInfo
         */        
        CommService.on('notifyExtraPontoMovel', function (elementoRastreavelInfo) {
            console.log('Socket PontoMovel - notifyExtraPontoMovel');
            //Se nenhum ponto móvel estiver carregado não exibo a notificação
            if (PontoMovelManager.layersPontoMovel.getLayers().length == 0) {
                return;
            }

            var mensagem = "";

            _.each(elementoRastreavelInfo.extras, function (extra) {
                mensagem = mensagem.concat('<label class="md-accent" style="padding-left: 30px; font-size: 14px">' + extra.nome + ': ' + extra.valor + '</label>', '<br>');
            });

            $mdDialog.show({
                scope: $scope.$new(),
                template: '<md-dialog draggable style="width: 300px;">' +
                    '<md-title style="padding: 20px 0px 0px 20px;">' + 'Notificação Extra - ' + elementoRastreavelInfo.nomeER + '</md-title>' +
                    '<br>' +
                    '<div flex>' +

                    ' <div style="height: 100px;" class="ag-fresh">' +

                    '<label class="md-accent" style="padding-left: 30px; font-size: 14px">' + $scope.res('PONTO_MOVEL_DATA_POSICAO') + ': '
                    + elementoRastreavelInfo.dataPosicaoStr + '</label>' + '<br>' +
                    mensagem + '<br>' +

                    ' </div>' +
                    '  <div class="md-actions">' +
                    '    <md-button ng-click="fechar()">' + $scope.res('COMUM_CANCELAR') + '</md-button>' +
                    '  </div>' +

                    '  </div>' +
                    '</md-dialog>',
                controller: function ($scope, $mdDialog) {
                    $scope.fechar = function () {
                        $mdDialog.hide();
                    }
                }
            });

        });

        function fechar() {
            $scope.dispositivos = [];
            $scope.listERInfo = [];
            $scope.poiHidden = true;
            $scope.poisProximos = [];
            //desativarLayer();
        }

        angular.extend($scope, {
            data: {},
            exibirDispositivo: exibirDispositivo,
            buscarPercurso: buscarPercurso,
            exibirCategoria: exibirCategoria,
            pegarPOIs: pegarPOIs,
            pegarCameras: pegarCameras,
            voarParaSubItem: voarParaSubItem,
            $apiPontoMovel: {
                buscarPontoMovel: buscarPontoMovel,
                fechar: fechar,
                buscarPontosMoveisPorTipo: buscarPontosMoveisPorTipo,
                removerLayers: removerLayers
            }
        });

        MainState.registerDirective('pontoMovel', $scope.$apiPontoMovel);
    }

    function s4cPontoMovel() {
        return {
            restrict: 'EA',
            templateUrl: 'app/directives/ponto-movel/ponto_movel.html',
            scope: {},
            controller: pontoMovelController
        };
    }

    angular.module('s4c.components.pontoMovel', [])
        .directive('s4cPontoMovel', s4cPontoMovel);
})();