/**
* @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);
})();