Source: directives/detalhamento/detalhamento.service.js

/**
 * @ngdoc directives
 * @name DetalhamentoService
 * @module s4c.directives.detalhamento.DetalhamentoService
 *
 * @description
 * `DetalhamentoService` Gerencia a busca de informações sobre um ponto de interesse no frontend e API do backend.
 *
 */
(function () {
    'use strict';

    angular.module('s4c.components.detalhamento')
        .service('DetalhamentoService', DetalhamentoService);

    DetalhamentoService.$inject = [
        '$http',
        '$q',
        'API_ENDPOINT',
        'CamadasService',
        'DetalhamentoManager',
        'Base'
    ];

    function DetalhamentoService($http, $q, API_ENDPOINT, CamadasService, DetalhamentoManager, Base) {

        var service = {
            enviarComentario: enviarComentario,
            enviarCronologia: enviarCronologia,
            pegarPoi: pegarPoi,
            pegarBasesProximas: pegarBasesProximas,
            pegarPoisProximos: pegarPoisProximos,
            pegarIncidentesProximos: pegarIncidentesProximos,
            pegarAreasAtuacao: pegarAreasAtuacao,
            pegarIncidente: pegarIncidente,
            pegarAcervo: pegarAcervo,
            pegarCamerasProximas: pegarCamerasProximas,
            pegarPlanejamento: pegarPlanejamento,
            findAreaAtuacao: findAreaAtuacao,
            abrirZonaDeObservacao: abrirZonaDeObservacao,
            pegarRotasProximas: pegarRotasProximas,
            pegarEventosPlanejados: pegarEventosPlanejados,
            pegarPoisContidos: pegarPoisContidos,
            pegarEventosContidos: pegarEventosContidos,
            removerIncidente: removerIncidente,
            pegarViaturasProximas: pegarViaturasProximas,
            pegarPoiPorChaveEstrangeira: pegarPoiPorChaveEstrangeira,
            getAttachedFile: getAttachedFile,
            on: on,
            trigger: trigger,
            _eventos: {
                'openOptionShare': []
            }
        };


        function on(nomeEvento, callback) {
            service._eventos[nomeEvento].push(callback);
        }

        function trigger(nomeEvento, args) {
            _.each(service._eventos[nomeEvento], function (callback) {
                callback(args);
            });
        }

        /**
         * @method getAttachedFile
         * 
         * 
         * @param {integer} id identificador unico do Arquivo a ser buscado
         * na API do S4C
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * Arquivo buscado.
         */
        function getAttachedFile(id) {
            var deferred = $q.defer();

            $http
                .get(API_ENDPOINT + 'filemanager/' + id, { responseType: 'arraybuffer' })
                .then(function (res) {
                    deferred.resolve(res.data);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findAreaAtuacao
         * 
         * 
         * @param {integer} id identificador unico da Area de Atuação a ser buscada
         * na API do S4C
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * Area de Atuação buscada.
         */
        function findAreaAtuacao(id, obj) {
            var deferred = $q.defer();

            $http.post('/pois/area_atuacao/', {
                id: id,
                latitude: obj.lat,
                longitude: obj.lng,
                geometry: obj.geometry
            }).then(function (res) {
                if (typeof res.data === 'object') {
                    deferred.resolve(res.data);
                } else {
                    deferred.reject(res);
                }
            }, function (err) {
                deferred.reject(err);
            });

            return deferred.promise;
        }

        /**
         * @method enviarComentario
         * 
         * @param {comentario} comentario a ser enviado para API do Fusion
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * Comentário enviado.
         */
        function enviarComentario(comentario) {
            var deferred = $q.defer();

            $http.put('/comentario', comentario)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method enviarCronologia
         * 
         * @param {integer} id identificador unico do Incidente a ser buscada
         * na API do S4C
         * @param {cronologia} cronologia a ser enviada para API do Fusion
         *
         * @returns {Promise} Promise que resolve com as informações sobre a
         * Cronologia enviada.
         */
        function enviarCronologia(incidenteId, cronologia) {
            var deferred = $q.defer();

            $http.post(API_ENDPOINT + 'incidentes/' + incidenteId + '/cronologia', cronologia)
                .then(function (res) {
                    deferred.resolve(res.data);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         *
         * @method pegarAcervo
         *
         * @param {integer} id identificador unico do Acervo a ser buscado na
         * API do Fusion
         *
         * @returns {Promise} Promise que resolve com os dados do Acervo
         * buscado.
         */
        function pegarAcervo(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'acervos/' + id)
                .then(function (res) {

                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarAreasAtuacao
         * 
         *
         * @param {obj} ponto Ponto de interesse para utilizar na busca.
         *
         * @returns {Promise} Promise que resolve com as informações sobre a
         * area de atuação em que o ponto de interesse está inserido.
         */
        function pegarAreasAtuacao(ponto, tipoItem) {
            var url = 'http://187.111.99.14/webservices/circunscricao.cfm?lat=';
            url += ponto.lat;
            url += '&lon=' + ponto.lng;

            var deferred = $q.defer();

            $http.get(url)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarPlanejamento
         * 
         * 
         * @param {integer} id identificador unico do planejamento a ser buscado
         * na API do Fusion
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * planejamento buscado.
         */
        function pegarPlanejamento(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'camadas/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }


        /**
         * @method removerIncidente
         * 
         * 
         * @param {integer} id identificador unico do Incidente a ser buscado
         * na API do Fusion
         * @param {motivo} motivo Texto com a razão para a remoção do Incidente 
		 *	
         * @returns {Promise} Promise que resolve com as informações sobre o
         * Incidente buscado.
         */
        function removerIncidente(id, motivo) {
            var deferred = $q.defer();

            $http({
                method: 'DELETE',
                url: API_ENDPOINT + 'incidentes/' + id,
                data: motivo,
                headers: {
                    'Content-type': 'application/json'
                }
            })
                //$http(API_ENDPOINT + 'incidentes/' + id, { data : motivo })
                .then(function (res) {

                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }



        /**
         * @method pegarIncidente
         * 
         *
         * @param {integer} id identificador unico do incidente a ser buscado
         * na API do Fusion
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * incidente buscado.
         */
        function pegarIncidente(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'incidentes/' + id)
                .then(function (res) {

                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarPoi
         * 
         *
         * @param {integer} id identificador unico do ponto de interesse a ser
         * buscado na API do Fusion
         *
         * @returns {Promise} Promise que resolve com as informações sobre o
         * Ponto de Interesse buscado.
         */
        function pegarPoi(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'pois/' + id)
                .then(function (res) {

                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarCamerasProximas
         * 
         *
         * @param {obj} ponto Objeto contendo informações do ponto clicado para
         * buscar cameras próximas à ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre os
         * pontos próximos ao Ponto de Interesse clicado.
         */
        function pegarCamerasProximas(obj) {
            var deferred = $q.defer();

            if (!obj.geometry) {
                $http.get(API_ENDPOINT + 'cameras/proxima/' + obj.lat + '/' + obj.lng)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });
            } else {
                $http.post(API_ENDPOINT + 'cameras/proxima', obj.geometry)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });
            }

            return deferred.promise;
        }

        /**
         * @method pegarIncidentesProximos
         * 
         *
         * @param {obj} ponto Objeto contendo informações do ponto clicado para
         * buscar incidentes próximos à ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre os
         * pontos próximos ao Ponto de Interesse clicado.
         */
        function pegarIncidentesProximos(obj) {

            var deferred = $q.defer();

            var deferred = $q.defer();

            if (obj.geometry) {

                $http.post(API_ENDPOINT + 'incidentes/proxima', obj.geometry)
                    .then(function (res) {

                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }

                    }, function (err) {
                        deferred.reject(err);
                    });

            } else {
                $http.get(API_ENDPOINT + 'incidentes/proxima/' + obj.lat + '/' + obj.lng)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });
            }

            return deferred.promise;
        }

        /**
         * @method pegarPoisProximos
         * 
         * 
         *
         * @param {obj} ponto Objeto contendo informações do ponto clicado para
         * buscar pontos de interesse próximos à ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre os
         * pontos próximos ao Ponto de Interesse clicado.
         */
        function pegarPoisProximos(obj) {
            var deferred = $q.defer();

            if (!obj.geometry) {

                $http.get(API_ENDPOINT + 'pois/proxima/' + obj.lat + '/' + obj.lng)
                    .then(function (res) {

                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }

                    }, function (err) {
                        deferred.reject(err);
                    });

            } else {

                $http.post(API_ENDPOINT + 'pois/proxima', obj.geometry)
                    .then(function (res) {

                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }

                    }, function (err) {
                        deferred.reject(err);
                    });
            }

            return deferred.promise;
        }

        /**
         * @method pegarBasesProximas
         * 
         *
         * @param {obj} ponto Objeto contendo informações do ponto clicado para
         * buscar Bases de Conhecimento proximas à ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre as
         * Bases de Conhecimento próximas ao Ponto de Interesse clicado.
         */
        function pegarBasesProximas(obj) {
            var deferred = $q.defer();

            if (obj.geometry) {

                $http.post(API_ENDPOINT + 'base_conhecimento/proxima/', obj.geometry)
                    .then(function (res) {

                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }

                    }, function (err) {
                        deferred.reject(err);
                    });

            } else {
                $http.get(API_ENDPOINT + 'base_conhecimento/proxima/' + obj.lat + '/' + obj.lng)
                    .then(function (res) {

                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }

                    }, function (err) {
                        deferred.reject(err);
                    });
            }

            return deferred.promise;
        }

        /**
         * @method abrirZonaDeObservacao
         * 
         *
         * @param {integer} id Identificador unico da Zona de Observação
         *
         */
        function abrirZonaDeObservacao(id) {
            DetalhamentoManager.abrirZonaDeObservacao(id);
        }

        /**
         * @method pegarRotasProximas
         * 
         *
         * @param {integer} id Identificador único do ponto clicado para
         * buscar Rotas proximas à ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre as
         * Rotas próximas ao Ponto de Interesse clicado.
         */
        function pegarRotasProximas(id) {

            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'rotas_unificadas/proximas/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarEventosPlanejados
         * 
         *
         * @param {String} chave_estrangeira Identificador único do ponto clicado para
         * buscar os Eventos Planejados
         *
         * @returns {Promise} Promise que resolve com as informações sobre os
         * Eventos Planejados
         */
        function pegarEventosPlanejados(chave_estrangeira) {

            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'evento_planejado/poi/' + chave_estrangeira)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarPoisContidos
         * 
         *
         * @param {integer} id Identificador único do ponto clicado para
         * buscar outros Pois contidos nele ele.
         *
         * @returns {Promise} Promise que resolve com as informações sobre as
         * POis contidos no Ponto de Interesse clicado.
         */
        function pegarPoisContidos(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'pois/contidos/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarPoiPorChaveEstrangeira
         * 
         *
         * @param {String} chave_estrangeira Identificador único do POI
         * 
         * @returns {Promise} Promise que resolve com as informações sobre os
         * POis buscados por chave_estrangeira
         */
        function pegarPoiPorChaveEstrangeira(chave_estrangeira) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'pois/chave/' + chave_estrangeira)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarEventosContidos
         * 
         *
         * @param {Integer} id Identificador unido do Ponto de Interesse clicado
         * 
         * @returns {Promise} Promise que resolve com as informações sobre os
         * Eventos Planejados contidos no POI
         */
        function pegarEventosContidos(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'evento_planejado/contidos/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

       /**
         * @method pegarViaturasProximas
         * 
         * @param {obj} Objeto Com as informações das viaturas que serão usadas na busca por outras viaturas próximas
         * 
         * @returns {Promise} Promise que resolve com as informações sobre as
         * viaturas próximas
         */
        function pegarViaturasProximas(obj) {

            if (!obj.geometry) {

                return Base.obter('viaturas/proxima/' + obj.lat + '/' + obj.lng);

            } else {

                var deferred = $q.defer();

                $http.post(API_ENDPOINT + 'viaturas/proxima/', obj.geometry)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject();
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });

                return deferred.promise;
            }
        }

        return service;
    }
}());