Source: managers/RotasManager.js

/**
 * @ngdoc managers
 * @name RotasManager
 * @module s4c.managers.RotasManager
 *
 * @description
 * `RotasManager` Componente para comunicação entre uma página html qualquer e o controller da diretiva
 * 
 * 
 */
(function () {
    'use strict';

    function RotasManager(MainState, RotasService, $mdDialog, localize, MapaService) {
        var service = {
            'ativo': false,
            'zindex': 30,
            'rotaAtiva': {},
            'desenhoAtivo': {},

            /**
             * @method desenharPoligono
             * @param {*} data 
             */
            'desenharPoligono': function (data) {
                MapaService.desenharPoligono(data);
            },

            /**
             * @method voarParaObjeto
             * @param {*} obj 
             */
            'voarParaObjeto': function (obj) {
                var coords = JSON.parse(obj.geojson);
                MapaService.flyTo(coords);
            },
            
            /**
             * @method deletar
             */
            'deletar': function () {
                if (this.rotaAtiva.id) {
                    var rotaId = this.rotaAtiva.id;

                    var confirm = $mdDialog.confirm()
                        .title(localize.res('ROTA_DESEJA_EXCLUIR'))
                        .content(localize.res('PRESET_CONFIRMAR_SALVAR_MENSAGEM'))
                        .ariaLabel(localize.res('ROTA_EXCLUIR'))
                        .ok(localize.res('COMUM_OK'))
                        .cancel(localize.res('COMUM_CANCELAR'));

                    $mdDialog.show(confirm).then(function () {
                        RotasService
                            .deletarRota(rotaId)
                            .then(function () {
                                $mdDialog
                                    .show($mdDialog.alert()
                                        .title(localize.res('COMUM_SUCESSO'))
                                        .content(localize.res('ROTA_DELETADA_SUCESSO'))
                                        .ok(localize.res('COMUM_OK')));

                                var rotas = MainState.getDirective('rotas');

                                MapaService.removerRotasDesenhadas();
                                if (rotas) {
                                    rotas.atualizarRotas();
                                }

                                service.fechar();
                            },
                                function (err) {
                                    if (err.status = 403) {
                                        $mdDialog.show(
                                            $mdDialog.alert()
                                                .title(localize.res('COMUM_ERRO'))
                                                .content(localize.res('SOMENTE_AUTOR_DELETAR'))
                                                .ariaLabel('')
                                                .ok(localize.res('COMUM_OK'))
                                        );
                                    } else {
                                        $mdDialog.show(
                                            $mdDialog.alert()
                                                .title(localize.res('COMUM_ERRO'))
                                                .content(localize.res('ROTA_NAO_ENCONTRADA'))
                                                .ariaLabel('')
                                                .ok(localize.res('COMUM_OK'))
                                        );
                                    }
                                });
                    });
                }
            },
            /**
             * @method editar
             * @param {*} rota 
             */
            'editar': function (rota) {
                this.ativo = true;
                this.rotaAtiva = {
                    'criador': rota.criador.nome,
                    'nome': rota.nome,
                    'descricao': rota.descricao,
                    'origem': rota.origem,
                    'destino': rota.destino,
                    'id': rota.id,
                    'tempo_regular': rota.RotaLeituras[0].regularTime,
                    'tempo_atual': rota.RotaLeituras[0].currentTime,
                    'cor': RotasService.pegarCor(rota),
                    DepartamentoId: rota.DepartamentoId
                };
                this.rotaAtiva.modo = 'edicao';
                this.rotaAtiva.loading = true;
                this.rotaAtiva.pontos = converteRotaTrechos(rota.RotaTrechos);

                RotasService.pegarDetalhamento(rota.id)
                    .then(function (detalhamentoData) {
                        this.rotaAtiva.areasAtuacaoPorLabel = detalhamentoData.areasAtuacaoPorLabel;
                        this.rotaAtiva.incidentes = detalhamentoData.incidentes;
                        this.rotaAtiva.bases = detalhamentoData.bases;
                        this.rotaAtiva.cameras = detalhamentoData.cameras;
                        this.rotaAtiva.loading = false;
                    }.bind(this), function () {
                        this.rotaAtiva.loading = false;
                    }.bind(this));

                RotasService.getAlarmesRota(rota.id)
                    .then(function (response) {
                        this.rotaAtiva.alarmes = response.data;
                    }.bind(this));

                MainState.detalhamentosAtivos.rotas = this;

                RotasService.atualizarPontos(this.rotaAtiva.pontos);

                function converteRotaTrechos(trechos) {

                    var pontos = [];

                    angular.forEach(trechos, function (trecho) {

                        var ponto1 = {
                            latLng: {
                                lat: trecho.de.coordinates[0],
                                lng: trecho.de.coordinates[1]
                            }
                        };

                        var ponto2 = {
                            latLng: {
                                lat: trecho.para.coordinates[0],
                                lng: trecho.para.coordinates[1]
                            }
                        }

                        pontos.push(ponto1);
                        pontos.push(ponto2);
                    });

                    return pontos;
                }
            },
            /**
             * @method abrir
             */
            'abrir': function () {
                this.ativo = true;
                this.rotaAtiva = {
                    modo: 'criacao'
                };
                MapaService.desenharRota();
                MainState.detalhamentosAtivos.rotas = this;
            },
            /**
             * @method fechar
             */
            'fechar': function () {
                this.ativo = false;
                MapaService.removerRouter();
                delete MainState.detalhamentosAtivos.rotas;
            },
            /**
             * @method reloadAlarmes
             */
            'reloadAlarmes': function () {
                RotasService.getAlarmesRota(this.rotaAtiva.id)
                    .then(function (response) {
                        this.rotaAtiva.alarmes = response.data;
                    }.bind(this));
            },
            /**
             * @method removerPonto
             * @param {*} index 
             */
            'removerPonto': function (index) {
                MapaService.removerPonto(index);
            },
            /**
             * @method addAlarmeRange
             * @param {*} rota 
             * @param {*} alarme 
             */
            'addAlarmeRange': function (rota, alarme) {
                $mdDialog.show({
                    templateUrl: 'app/directives/adicionar-rotas/dialog-alarme-range.html',
                    locals: {
                        rota: rota,
                        alarme: alarme
                    },
                    controller: ['$scope', '$mdDialog', addAlarmeRangeCtrl.bind(this)]
                });

                function addAlarmeRangeCtrl($scope, $mdDialog) {
                    $scope.res = $scope.$root.res;
                    $scope.saving = false;
                    if (!alarme.detalhes) {
                        alarme.detalhes = {};
                    }
                    var ranges = alarme.detalhes.ranges || [];
                    var range = {};

                    $scope.closeDialog = function () {
                        this.openAlarmeDialog(rota, alarme);
                    }.bind(this);

                    $scope.addRange = function () {
                        $scope.saving = true;
                        range.start = ($scope.range.start) ? moment($scope.range.start, 'DD/MM/YYYY HH:mm').format() : '';
                        range.end = ($scope.range.end) ? moment($scope.range.end, 'DD/MM/YYYY HH:mm').format() : '';
                        ranges.push(range);
                        alarme.detalhes.ranges = ranges;
                        this.openAlarmeDialog(rota, alarme);
                    }.bind(this);
                }
            },
            /**
             * @method openAlarmeDialog
             * @param {*} rota 
             * @param {*} alarme 
             */
            'openAlarmeDialog': function (rota, alarme) {
                $mdDialog.show({
                    templateUrl: 'app/directives/adicionar-rotas/dialog-alarme.html',
                    locals: {
                        alarme: alarme
                    },
                    controller: ['$scope', '$mdDialog', addAlarmeCtrl.bind(this)]
                });

                function addAlarmeCtrl($scope, $mdDialog) {
                    $scope.res = $scope.$root.res;
                    $scope.sending = false;
                    $scope.alarme = alarme || {};
                    $scope.rota = rota || {};

                    $scope.addAlarmeRange = this.addAlarmeRange.bind(this);

                    $scope.removeRange = function (index) {
                        $scope.alarme.detalhes.ranges.splice(index, 1);
                    };

                    $scope.closeDialog = function () {
                        $mdDialog.hide();
                    };

                    $scope.saveAlarme = function (alarme) {
                        $scope.sending = true;
                        $scope.formAddAlarmeRota.nome.$touched = true;

                        if ($scope.formAddAlarmeRota.$valid) {
                            alarme.tipo = 'IncidenteRota';

                            if (!alarme.id) {
                                RotasService.addAlarmeRota(rota.id, alarme)
                                    .then(function (response) {
                                        $scope.sending = false;
                                        this.reloadAlarmes();
                                        $scope.closeDialog();
                                    }.bind(this));
                            } else {
                                RotasService.updateAlarmeRota(alarme)
                                    .then(function (response) {
                                        $scope.sending = false;
                                        this.reloadAlarmes();
                                        $scope.closeDialog();
                                    }.bind(this));
                            }
                        }
                    }.bind(this);
                }
            },

            /**
             * @method deleteAlarme
             * @param {*} alarme 
             */
            'deleteAlarme': function (alarme) {
                RotasService.deleteAlarmeRota(alarme.id)
                    .then(function (response) {
                        this.reloadAlarmes();
                    }.bind(this));
            }
        };

        return service;
    }

    RotasManager.$inject = ['MainState', 'RotasService', '$mdDialog', 'localize', 'MapaService'];

    angular.module('s4c.managers')
        .service('RotasManager', RotasManager);
})();