Source: managers/RotasUnificadasManager.js

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

    function RotasUnificadasManager(MainState, RotasUnificadasService, $mdDialog, localize, RotasUnificadasFilter, MapaService) {
        var service = {
            'ativo': false,
            'zindex': 30,
            'rotaAtiva': {},
            'desenhoAtivo': {},
            /**
             * @method desenharPoligono
             * @param {*} data 
             */
            'desenharPoligono': function (data) {
                MapaService.desenharPoligonoRotaUnficada(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 () {
                        RotasUnificadasService
                            .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');

                                RotasUnificadasFilter.getInstance('rotas-unificadas-filter').trigger("rotaUnificadasRemoved");

                                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 = {
                    'rotaUnificadaId': rota.rotaUnificadaId,
                    'criador': rota.criador.nome,
                    'nome': rota.nome,
                    'descricao': rota.descricao,
                    'origem': rota.origem,
                    'destino': rota.destino,
                    'id': rota.id,
                    'tempo_regular': rota.RotaLeituras[0] ? rota.RotaLeituras[0].regularTime : 0,
                    'tempo_atual': rota.RotaLeituras[0] ? rota.RotaLeituras[0].currentTime : 0,
                    'cor': RotasUnificadasService.pegarCor(rota),
                    DepartamentoId: rota.DepartamentoId
                };
                this.rotaAtiva.modo = 'criacao';
                this.rotaAtiva.loading = true;
                this.rotaAtiva.pontos = converteRotaTrechos(rota.RotaTrechos);

                RotasUnificadasService.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.rotas = detalhamentoData.rotas;
                        this.rotaAtiva.loading = false;
                    }.bind(this), function () {
                        this.rotaAtiva.loading = false;
                    }.bind(this));

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

                if (rota.editavel) {
                    MapaService.desenharRotaUnificada(this.rotaAtiva.pontos);
                } else {
                    MapaService.desenharRotaUnificadaKml(this.rotaAtiva.pontos);
                    MapaService.desenharTrajetoRotaUnificadaKml(rota.shape);
                }

                MainState.detalhamentosAtivos.rotas_unificadas = this;

                function converteRotaTrechos(trechos) {

                    var pontos = [];

                    pontos.contains = function (obj) {
                        var i = this.length;
                        while (i--) {
                            if (this[i].latLng.lat == obj.latLng.lat && this[i].latLng.lng == obj.latLng.lng) {
                                return true;
                            }
                        }
                        return false;
                    }

                    for (var index in trechos) {

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

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

                        if (!pontos.contains(ponto1)) {
                            pontos.push(ponto1);
                        }
                        if (!pontos.contains(ponto2)) {
                            pontos.push(ponto2);
                        }
                    }

                    return pontos;
                }

            },
            /**
             * @method abrir
             * @param {*} rota 
             */
            'abrir': function (rota) {
                this.ativo = true;
                if (rota != null && rota.id != null) {
                    function converteRotaTrechos(trechos) {

                        var pontos = [];

                        pontos.contains = function (obj) {
                            var i = this.length;
                            while (i--) {
                                if (this[i].latLng.lat == obj.latLng.lat && this[i].latLng.lng == obj.latLng.lng) {
                                    return true;
                                }
                            }
                            return false;
                        }

                        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]
                                }
                            }

                            if (!pontos.contains(ponto1)) {
                                pontos.push(ponto1);
                            }
                            if (!pontos.contains(ponto2)) {
                                pontos.push(ponto2);
                            }
                        });

                        return pontos;
                    }

                    this.rotaAtiva = {
                        modo: 'criacao',
                        'rotaUnificadaId': rota.id,
                        'nome': rota.nome,
                        'descricao': rota.descricao,
                        'origem': rota.origem,
                        'destino': rota.destino,
                        DepartamentoId: rota.DepartamentoId
                    };

                    this.rotaAtiva.loading = true;
                    this.rotaAtiva.pontos = converteRotaTrechos(rota.RotaTrechos);
                    MapaService.desenharRotaUnificada(this.rotaAtiva.pontos);
                    MainState.detalhamentosAtivos.rotas_unificadas = this;
                } else {
                    this.rotaAtiva = {
                        modo: 'criacao'
                    };
                    MapaService.desenharRotaUnificada();
                    MainState.detalhamentosAtivos.rotas_unificadas = this;
                }
            },
            /**
             * @method fechar
             */
            'fechar': function () {
                this.ativo = false;
                MapaService.removerRouterRotaUnificada();
                delete MainState.detalhamentosAtivos.rotas_unificadas;
            },
            /**
             * @method reloadAlarmes
             */
            'reloadAlarmes': function () {
                RotasUnificadasService.getAlarmesRota(this.rotaAtiva.id)
                    .then(function (response) {
                        this.rotaAtiva.alarmes = response.data;
                    }.bind(this));
            },
            /**
             * @method removerPontoRotaUnificada
             * @param {*} index 
             */
            'removerPontoRotaUnificada': function (index) {
                MapaService.removerPontoRotaUnificada(index);
            },
            /**
             * @method addAlarmeRange
             * @param {*} rota 
             * @param {*} alarme 
             */
            'addAlarmeRange': function (rota, alarme) {
                $mdDialog.show({
                    templateUrl: 'app/directives/adicionar-rotas-unificadas/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-unificadas/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.putMask = function () {
                        $("#tempo_atraso").mask("99:99:99");
                    }


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

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

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

                    $scope.tipos = [{
                        label: 'Incidente',
                        value: 'IncidenteRota'
                    }, {
                        label: 'Transito',
                        value: 'Transito'
                    }];

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

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

                            if (!alarme.id) {
                                RotasUnificadasService.addAlarmeRota(rota.id, alarme)
                                    .then(function (response) {
                                        $scope.sending = false;
                                        this.reloadAlarmes();
                                        $scope.closeDialog();
                                    }.bind(this));
                            } else {
                                RotasUnificadasService.updateAlarmeRota(alarme)
                                    .then(function (response) {
                                        $scope.sending = false;
                                        this.reloadAlarmes();
                                        $scope.closeDialog();
                                    }.bind(this));
                            }
                        }
                    }.bind(this);
                }
            },
            /**
             * @method deleteAlarme
             * @param {*} alarme 
             */
            'deleteAlarme': function (alarme) {
                RotasUnificadasService.deleteAlarmeRota(alarme.id)
                    .then(function (response) {
                        this.reloadAlarmes();
                    }.bind(this));
            },
            /**
             * @method reloadRotas
             */
            'reloadRotas': function () {
                RotasUnificadasFilter.getInstance('rotas-unificadas-filter').trigger('rotas');
            },
            /**
             * @method atualizarTempo
             * @param {*} rotaAtiva 
             */
            'atualizarTempo': function (rotaAtiva) {
                var waypoints = [];
                _.reduce(rotaAtiva.pontos, function (a, sum) {
                    waypoints.push({
                        de: a.latLng,
                        para: sum.latLng
                    });
                    return sum;
                });

                RotasUnificadasService.calcularTempoRotaCriada({
                    trechos: waypoints
                }, rotaAtiva.id)
                    .then(function (tempo) {

                        var value = ((100 * (tempo.currentTime / tempo.regularTime)) - 100);

                        if (value <= 10) {
                            rotaAtiva.cor = '#8AC249';
                        } else if (value >= 10 && value <= 50) {
                            rotaAtiva.cor = '#FFFF00';
                        } else {
                            rotaAtiva.cor = '#F34235';
                        }

                        rotaAtiva.tempo_atual = tempo.currentTime;
                        rotaAtiva.tempo_regular = tempo.regularTime;
                        RotasUnificadasFilter.getInstance('rotas-unificadas-filter').trigger("tempoRotaAtualiazado", rotaAtiva);
                    });

            }
        };

        return service;
    }

    RotasUnificadasManager.$inject = ['MainState', 'RotasUnificadasService', '$mdDialog', 'localize', 'RotasUnificadasFilter', 'MapaService'];

    angular.module('s4c.managers')
        .service('RotasUnificadasManager', RotasUnificadasManager);

})();