Source: directives/mensageria/conversas/conversas.js

/**
 * @ngdoc directives
 * @name Conversas
 * @module s4c.directives.mensageria.conversas.Conversas
 *
 * @description
 * `MensageriaConversas` Gerenciamento de conversas do módulo de mensageria 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .directive('mensageriaConversas', MensageriaConversas);

    moment.locale('pt-br', {
        calendar: {
            lastWeek: 'DD/MM/YYYY',
            lastDay: '[Ontem]',
            sameDay: 'LT',
            sameElse: 'DD/MM/YYYY'
        }
    });

    MensageriaConversas.$inject = [
        'MensageriaService',
        '$q',
        '$filter',
        'MensageriaFilter',
        'AuthService',
        'MensageriaChatUsuario',
        'MensageriaManager',
        'CommService',
        'MensageriaChatGrupo',
        '$mdDialog',
        'localize',
        'Base',
        '$sce',
        'MainState'
    ];

    function MensageriaConversas(MensageriaService, $q, $filter, MensageriaFilter,
        AuthService, MensageriaChatUsuario, MensageriaManager, CommService, MensageriaChatGrupo, $mdDialog, localize, Base, $sce, MainState) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/mensageria/conversas/conversas.html',
            replace: true,
            scope: {
                'state': '=state',
                'compartilhando': '=compartilhando',
                'tipo': '=tipo',
                'compartilhamentoDetalhes': '=compartilhamentoDetalhes'
            },
            link: function ($scope, $elem, $attrs) {
                $scope.res = $scope.$root.res;
                angular.extend($scope, {
                    buscarContatos: buscarContatos,
                    buscarUsuarios: buscarUsuarios,
                    abrirChatUsuario: abrirChatUsuario,
                    abrirChatGrupo: abrirChatGrupo,
                    loadContacts: loadContacts,
                    state: {
                        chatUsuarioAtivo: false,
                        chatGrupoAtivo: false
                    },
                    contatos: [],
                    usuarios: [],
                    grupos: [],
                    selecionados: [],
                    usuariosOnlineIds: [],
                    criticalRegion: false,
                    unreadMessages: [],
                    unreadMessagesGroup: [],
                    isAddGrupo: false,
                    filters: {
                        texto: ''
                    },
                    usuarioChat: {},
                    me: AuthService.user.info,
                    compartilharScreen: false,
                    compartilharTipo: 'usuario',
                    compartilharNext: {},
                    res: $scope.$root.res,
                    reloadContacts: reloadContacts

                });

                CommService.on('updateUserList', function (uuid) {

                    if (uuid != AuthService.user.info.id) {
                        reloadContacts();
                    }
                });

                $scope.exibirLoadingContatos = true;

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

                    if ($scope.contatos) {
                        $q.all([
                            MensageriaService.findContatos(false)
                        ]).then(function (results) {
                            buildContacts(results[0]);
                        });
                    }

                    if ($scope.usuarios) {

                        $q.all([
                            MensageriaService.findUsuarios(false),
                            _obterUsuariosOnline()

                        ]).then(function (results) {

                            $scope.usuariosOnlineIds = results[1];
                            buildUsuarios(results[0]);

                        });
                    }

                }

                $scope.exibirLoadingConversas = true;
                /**
                 * @method buildUsuarios
                 * @param {*} usuarios 
                 */
                function buildUsuarios(usuarios) {
                    _.each(usuarios, function (usuario) {

                        var contato = _.find($scope.contatos, function (contato) {
                            return contato.id === usuario.id && (contato.isGrupo == null || contato.isGrupo == false);
                        });

                        usuario.mensagem.createdAtFormated = _formatDate(usuario.mensagem.createdAt);

                        var compareUsuariosIds = _.map($scope.usuariosOnlineIds, function (user) {
                            return user;
                        });

                        if (contato != null) {
                            usuario.nome = contato.nome;
                            usuario.nome_departamento = contato.nome_departamento;
                            usuario.DepartamentoId = contato.DepartamentoId;
                        }

                        usuario.exibir = true;
                        if (_.filter(compareUsuariosIds, function (compare) {
                            return compare === usuario.id;
                        }).length > 0) {
                            usuario.online = 1;
                        } else {
                            usuario.online = 0;
                        }
                    });

                    sortUsers(usuarios);

                    $scope.usuarios = usuarios;
                    $scope.selecionados = $scope.usuarios;
                    $scope.exibirLoadingContatos = true;

                    var novasMensagensTitle = 0;
                    _.each($scope.usuarios, function (usuario) {

                        if (usuario.isGrupo == true) {
                            usuario.online = 1;
                        }

                        if (!usuario.newMessage) {
                            usuario.newMessage = [];
                        }
                        if (usuario.novasMensagens != null) {
                            novasMensagensTitle += usuario.novasMensagens;
                            MensageriaManager.unreadMessages = true;
                        }
                        for (i = 0; i < usuario.novasMensagens; i++) {
                            usuario.newMessage[i] += 1;
                        }
                    });
                    if (novasMensagensTitle > 0) {
                        document.title = '(' + novasMensagensTitle + ') S4C';
                    }
                }

                /**
                 * @method buildContacts
                 * @param {*} contatos 
                 */
                function buildContacts(contatos) {

                    _.each(contatos, function (contato) {

                        var compareUsuariosIds = _.map($scope.usuariosOnlineIds, function (user) {
                            return user;
                        });

                        contato.exibir = true;
                        if (_.filter(compareUsuariosIds, function (compare) {
                            return compare === contato.id;
                        }).length > 0) {
                            contato.online = 1;
                        } else {
                            contato.online = 0;
                        }
                    });
                    $scope.contatos = contatos;
                    $scope.exibirLoadingContatos = false;
                }

                $scope.$apimsg = {
                    reloadContacts: reloadContacts
                };

                MainState.registerDirective('MensageriaConversas', $scope.$apimsg);

                /**
                 * @method loadContacts
                 */
                function loadContacts() {
                    $q.all([
                        _obterContatos()
                    ]).then(function (results) {
                        buildContacts(results[0]);
                        $scope.exibirLoadingContatos = false;
                    });
                }

                MensageriaChatGrupo.on('updateFotoGrupo', function (data) {
                    angular.forEach($scope.usuarios, function (usuario) {
                        if (usuario.isGrupo && usuario.mensagem.nome == data.nome) {
                            console.log(usuario.mensagem.urlIcone = data.urlIcone);
                        }
                    });
                });

                /**
                 * @method usuarioOnline
                 */
                CommService.on('usuarioOnline', function (usuario) {

                    for (var index in $scope.usuarios) {
                        if ($scope.usuarios[index].id == usuario.id) {
                            $scope.usuarios[index].online = 1;
                            break;
                        }
                    }

                    for (var index in $scope.contatos) {
                        if ($scope.contatos[index].id == usuario.id) {
                            $scope.contatos[index].online = 1;
                            break;
                        }
                    }

                    _filtrarUsuarios();

                });

                /**
                 * @method usuarioOffline
                 */
                CommService.on('usuarioOffline', function (usuario) {

                    for (var index in $scope.usuarios) {
                        if ($scope.usuarios[index].id == usuario.id) {
                            $scope.usuarios[index].online = 0;
                            break;
                        }
                    }

                    for (var index in $scope.contatos) {
                        if ($scope.contatos[index].id == usuario.id) {
                            $scope.contatos[index].online = 0;
                            break;
                        }
                    }

                    _filtrarUsuarios();

                });

                /**
                 * @method grupoRemovido
                 */
                MensageriaChatGrupo.on('grupoRemovido', function (mensagem) {

                    var userIndex;
                    angular.forEach($scope.usuarios, function (usuario) {
                        if (usuario.mensagem.id == (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId)) {

                            usuario.mensagem.mensagem = mensagem.mensagem;
                            usuario.nome = mensagem.Usuario.nome;
                            usuario.mensagem.createdAt = moment().format('YYYY-MM-DD HH:mm');
                            usuario.participantes = mensagem.participantes;
                            usuario.mensagem.nome = mensagem.grupoNome;
                            group = usuario;
                            userIndex = $scope.usuarios.indexOf(usuario);
                        }
                    });

                    $scope.usuarios.splice(userIndex, 1);

                    if ($scope.grupoChat) {
                        if (group.mensagem.id == $scope.grupoChat.id) {
                            $scope.state.chatGrupoAtivo = false;
                        }
                    }

                    //Exibe um popup de aviso para o usuario
                    if ($scope.me.id != (mensagem.usuario || mensagem.Usuario.id) && MensageriaManager.ativo) {
                        var confirm = $mdDialog.confirm()
                            .title('Grupo removido')
                            .content('O grupo ' + mensagem.grupoNome + " do qual você faz parte foi removido pelo administrador.")
                            .ok('Ok');

                        $mdDialog.show(confirm);
                    }
                });

                /**
                 * @method novaMensagem
                 */
                MensageriaChatGrupo.on('novaMensagem', function (mensagem) {

                    MensageriaManager.unreadMessages = true;

                    if ($scope.criticalRegion == true) {
                        return;
                    }

                    $scope.criticalRegion = true;

                    var grupoAlvo;
                    for (var index = 0; index < $scope.usuarios.length; index++) {
                        if ($scope.usuarios[index].mensagem.id == (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId)) {
                            grupoAlvo = $scope.usuarios[index];
                        }
                    }

                    //Só entra aqui se for criação de grupo ou se foi incluído em um grupo.
                    if (!grupoAlvo) {

                        _obterGrupo(mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId).then(function (result) {

                            var text = '{}';
                            var gr = JSON.parse(text);
                            gr.mensagem = {};
                            gr.id = (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId);

                            gr.nome = result.nome;

                            gr.mensagem.id = (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId);
                            gr.mensagem.nome = result.nome;
                            gr.mensagem.mensagem = _removerTextoCompartilhamento(mensagem.mensagem);
                            gr.mensagem.createdAt = moment().format('YYYY-MM-DD HH:mm');
                            gr.mensagem.usuario = mensagem.usuario;
                            gr.mensagem.destinatario = mensagem.destinatario;
                            gr.exibir = true;
                            gr.isGrupo = true;
                            gr.online = 1;

                            //Adiciona o grupo novo à lista de conversas
                            $scope.usuarios.push(gr);
                            notifyGroupUser(result, mensagem);
                            $scope.criticalRegion = false;
                            sortUsers($scope.usuarios);

                        });

                        return;
                    }

                    //Atualiza a ultima mensagem da conversa com a nova mensagem.
                    var group;
                    var userIndex;
                    for (var index = 0; index < $scope.usuarios.length; index++) {

                        if ($scope.usuarios[index].mensagem.id == (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId)) {

                            $scope.usuarios[index].mensagem.mensagem = mensagem.mensagem;
                            $scope.usuarios[index].nome = mensagem.Usuario.nome;

                            $scope.usuarios[index].participantes = mensagem.participantes;
                            $scope.usuarios[index].mensagem.createdAtFormated = _formatDate(mensagem.createdAt);
                            $scope.usuarios[index].mensagem.createdAt = moment().format('YYYY-MM-DD HH:mm');

                            if (mensagem.grupoNome) {
                                $scope.usuarios[index].mensagem.nome = mensagem.grupoNome;
                            }

                            group = $scope.usuarios[index];
                            userIndex = index;
                        }
                    }

                    sortUsers($scope.usuarios);

                    //Se o usuario logado foi removido do grupo, tira o grupo da lista de conversas.
                    if ($scope.me.id == mensagem.participanteRemovido) {
                        $scope.usuarios.splice(userIndex, 1);

                        //Exibe um popup de aviso para o usuario removido
                        var confirm = $mdDialog.confirm()
                            .title('Removido do grupo')
                            .content('Você foi removido do grupo ' + mensagem.grupoNome)
                            .ok('Ok');

                        $mdDialog.show(confirm);

                        if ($scope.grupoChat) {
                            if (group.mensagem.id == $scope.grupoChat.id) {
                                $scope.state.chatGrupoAtivo = false;
                            }
                        }
                    }

                    // Notifica o usuário logado e que pertence ao grupo.
                    notifyGroupUser(grupoAlvo, mensagem);
                    $scope.criticalRegion = false;

                });
                /**
                 * @method notifyGroupUser
                 * @param {*} grupoAlvo 
                 * @param {*} mensagem 
                 */
                function notifyGroupUser(grupoAlvo, mensagem) {

                    var countMessages;
                    if (!MensageriaManager.ativo || $scope.state.chatGrupoAtivo == false ||
                        ($scope.state.chatGrupoAtivo == true && $scope.grupoChat.id != (mensagem.grupoId || mensagem.GrupoUsuarioMensageriumId))) {

                        Notification.requestPermission(function (perm) {
                            var notification = new Notification((grupoAlvo.nome || mensagem.grupoNome) + '-' + (mensagem.Usuario.nome || ''), {
                                dir: "auto",
                                icon: "assets/images/logo_fundo_branco.png",
                                lang: "",
                                body: _removerTextoCompartilhamento(mensagem.mensagem),
                                tag: new Date().getTime(),
                            });
                            notification.onclick = function () {

                                if ($scope.me.id == mensagem.participanteRemovido) {
                                    MensageriaManager.abrir();
                                    notification.close();
                                    return;
                                }

                                if (MensageriaManager.ativo) {

                                    $scope.abrirChatGrupo(grupoAlvo);
                                    notification.close();
                                } else {
                                    MensageriaManager.abrir();
                                    setTimeout(function () {
                                        $scope.abrirChatGrupo(grupoAlvo);
                                        notification.close();
                                    }, 500);
                                }
                            }

                            // fecha a notificacao depois de 10sg
                            notification.onshow = function () {
                                setTimeout(notification.close, 10000);
                            }
                        });
                    }
                    // se o usuario nao estiver ativo, insere uma notificacao na lista
                    if (!$scope.state.chatGrupoAtivo) {
                        var conversa = _.find($scope.usuarios, function (user) { return user.mensagem.id == mensagem.grupoId; });
                        if (conversa) {
                            if (conversa.newMessage) {
                                conversa.newMessage.push(mensagem.mensagem)
                            } else {
                                conversa.newMessage = [].concat(mensagem.mensagem);
                            }
                        }
                    }

                    var text = '{"idGrupo": "", "countMessages": 0}';
                    obj = JSON.parse(text);
                    if (mensagem.destinatario != null) {
                        obj.idGrupo = mensagem.grupoId;
                    }
                    obj.countMessages = 1;

                    if ($scope.unreadMessagesGroup == null || $scope.unreadMessagesGroup.length == 0) {
                        $scope.unreadMessagesGroup[0] = obj;
                    } else {
                        $scope.unreadMessagesGroup[$scope.unreadMessagesGroup.length] = obj;
                    }

                    document.title = 'S4C';

                    countMessages = _.reduce($scope.usuarios, function (s, entry) {
                        return s + (entry.newMessage ? parseFloat(entry.newMessage.length) : 0);
                    }, 0);


                    if (countMessages) {
                        MensageriaManager.countMsgs += 1;
                        MensageriaManager.unreadMessages = true;
                        document.title = '(' + MensageriaManager.countMsgs + ') S4C';
                    }

                }
                
                /**
                 * @method loadNewMessagesCount
                 */
                function loadNewMessagesCount() {

                    MensageriaManager.countMsgs = 0;

                    MensageriaService.loadNewMessagesCount().then(function (count) {
                        MensageriaManager.countMsgs = count;

                        if (count > 0) {
                            MensageriaManager.unreadMessages = true;
                            document.title = '(' + count + ') S4C';
                        }
                    });

                }

                loadNewMessagesCount();

                /**
                 * @method novaMensagem
                 */
                MensageriaChatUsuario.on('novaMensagem', function (mensagem) {
                    MensageriaManager.unreadMessages = true;
                    var destinatario = _.find($scope.usuarios, function (user) { return user.id === mensagem.usuario && (user.isGrupo == null || user.isGrupo == false); });
                    var remetente = _.find($scope.usuarios, function (user) { return user.id === mensagem.destinatario && (user.isGrupo == null || user.isGrupo == false); });

                    if (mensagem.destinatario == $scope.me.id) {
                        var novaConversa = false;

                        if (destinatario != null && destinatario.mensagem != null) {
                            destinatario.mensagem = {};
                        } else {
                            var text = '{}';
                            destinatario = JSON.parse(text);
                            destinatario.mensagem = {};
                            destinatario.id = mensagem.Usuario.id;
                            novaConversa = true;
                        }

                        // insere a ultima mensagem, nao precisa fazer push, pq quando o cara clicar, vai carregar tudo!

                        destinatario.mensagem.usuario_nome = mensagem.Usuario.nome;
                        destinatario.mensagem.mensagem = _removerTextoCompartilhamento(mensagem.mensagem);
                        //destinatario.mensagem.createdAt = moment().format('YYYY-MM-DD HH:mm');
                        destinatario.mensagem.usuario = mensagem.usuario;
                        destinatario.mensagem.destinatario = mensagem.destinatario;


                        // se o usuario nao estiver ativo, insere uma notificacao na lista
                        if (!$scope.state.chatUsuarioAtivo || ($scope.state.chatUsuarioAtivo == true &&
                            $scope.usuarioChat.id != mensagem.Usuario.id)) {
                            if (destinatario.newMessage) {
                                destinatario.newMessage.push(mensagem.mensagem)
                            } else {
                                destinatario.newMessage = [].concat(mensagem.mensagem);
                            }
                        } else {
                            if (mensagem.lida == null) {
                                mensagem.lida = [$scope.me.id];
                            } else {
                                mensagem.lida.push($scope.me.id);
                            }
                            MensageriaService.atualizarMensagensLidas(mensagem.usuario, mensagem.destinatario);
                        }

                        //Faz o push para exibir na lista de conversas caso seja uma nova conversa.
                        if (novaConversa) {
                            $scope.usuarios.push(destinatario);
                            _novaConversa(destinatario);
                        }

                        var remetenteName = mensagem.Usuario.nome;

                        var text = '{"destinatario": "", "remetente":"", "countMessages": 0}';
                        obj = JSON.parse(text);
                        if (mensagem.destinatario != null) {
                            obj.destinatario = mensagem.destinatario;
                        }
                        if (mensagem.usuario != null) {
                            obj.remetente = mensagem.usuario;
                        }
                        obj.countMessages = 1;

                        if ($scope.unreadMessages == null || $scope.unreadMessages.length == 0) {
                            $scope.unreadMessages[0] = obj;
                        } else {
                            $scope.unreadMessages[$scope.unreadMessages.length] = obj;
                        }

                        // notifica apenas o cara que ta recebendo a mensagem
                        if (!MensageriaManager.ativo || $scope.state.chatUsuarioAtivo == false ||
                            ($scope.state.chatUsuarioAtivo == true &&
                                $scope.usuarioChat.id != mensagem.Usuario.id)) {

                            var countMessages = _.reduce($scope.usuarios, function (s, entry) {
                                return s + (entry.newMessage ? parseFloat(entry.newMessage.length) : 0);
                            }, 0);


                            MensageriaManager.countMsgs += countMessages;
                            Notification.requestPermission(function (perm) {
                                var notification = new Notification(remetenteName, {
                                    dir: "auto",
                                    icon: "assets/images/logo_fundo_branco.png",
                                    lang: "",
                                    body: _removerTextoCompartilhamento(mensagem.mensagem),
                                    tag: new Date().getTime(),
                                });
                                notification.onclick = function () {

                                    if (MensageriaManager.ativo) {

                                        $scope.abrirChatUsuario(destinatario);
                                        notification.close();
                                    } else {
                                        MensageriaManager.abrir();
                                        setTimeout(function () {
                                            $scope.abrirChatUsuario(destinatario);
                                            notification.close();
                                        }, 500);
                                    }
                                }

                                // fecha a notificacao depois de 10sg
                                notification.onshow = function () {
                                    setTimeout(notification.close, 10000);
                                }
                            });
                        }
                    }

                    if (mensagem.usuario == $scope.me.id) {
                        var novaConversa = false;
                        if (remetente != null && remetente.mensagem != null) {
                            remetente.mensagem = {};
                        } else {
                            var text = '{}';
                            remetente = JSON.parse(text);
                            remetente.mensagem = {};
                            remetente.id = mensagem.Destinatario.id;
                            novaConversa = true;
                        }

                        remetente.mensagem.usuario_nome = mensagem.Destinatario.nome;
                        remetente.mensagem.mensagem = _removerTextoCompartilhamento(mensagem.mensagem);
                        remetente.mensagem.createdAt = moment().format('YYYY-MM-DD HH:mm');
                        remetente.mensagem.createdAtFormated = _formatDate(remetente.mensagem.createdAt);

                        //Faz o push para exibir na lista de conversas caso seja uma nova conversa.
                        if (novaConversa) {
                            $scope.usuarios.push(remetente);
                            _novaConversaRemetente(remetente);
                        }
                    }

                    var countMessages = _.reduce($scope.usuarios, function (s, entry) {
                        return s + (entry.newMessage ? parseFloat(entry.newMessage.length) : 0);
                    }, 0);
                    MensageriaManager.countMsgs = countMessages;

                    document.title = 'S4C';

                    if (countMessages) {
                        document.title = '(' + countMessages + ') S4C';
                    }

                    MensageriaManager.unreadMessages = true;
                    sortUsers($scope.usuarios);

                });

                MensageriaFilter.getInstance('mensageria-filter-geral').on('filterChanged', function () {
                    _filtrarUsuarios();
                });

                $scope.openAddGrupo = function () {
                    $scope.isAddGrupo = !$scope.isAddGrupo;
                    $scope.filters.texto = '';
                    MensageriaChatUsuario.trigger('obterContatos');
                };

                /**
                 * @method obterInformacoes
                 */
                MensageriaChatUsuario.on('obterInformacoes', function () {
                    $q.all([
                        _obterUsuariosOnline(),
                        _obterUsuarios()

                    ]).then(function (results) {
                        $scope.usuariosOnlineIds = results[0];
                        $scope.exibirLoadingConversas = false;
                        buildUsuarios(results[1]);
                    });

                });

                /**
                 * @method sortUsers
                 * @param {*} usuarios 
                 */
                function sortUsers(usuarios) {

                    usuarios.sort(function (u1, u2) {
                        return (moment(u1.mensagem.createdAt).isBefore(moment(u2.mensagem.createdAt))) ? 1 :
                            (moment(u1.mensagem.createdAt).isAfter(moment(u2.mensagem.createdAt)) ? -1 : 0);
                    });
                }

                String.prototype.trunc = String.prototype.trunc ||
                    function (n) {
                        return this.length > n ? this.substr(0, n - 1) + '...' : this.toString();
                    };

                /**
                 * @method _removerTextoCompartilhamento
                 * @param {*} mensagem 
                 */
                function _removerTextoCompartilhamento(mensagem) {
                    var hasCompartilhamento = mensagem.match(/\@@(.*)\@@/);
                    if (hasCompartilhamento &&
                        hasCompartilhamento.length > 0) {

                        var stringToSplit = mensagem.match(/\@@(.*)\@@/)[1];
                        return mensagem.replace('@@' + stringToSplit + '@@', '');
                    }
                    if (mensagem.includes("<img")) {
                        mensagem = "um novo arquivo foi recebido.";
                    }

                    return mensagem;
                }

                /**
                 * @method _filtrarUsuarios
                 */
                function _filtrarUsuarios() {
                    _.each($scope.usuarios, function (usuario) {
                        usuario.exibir = false;

                        if (usuario.mensagem) {
                            usuario.mensagem.mensagem = _removerTextoCompartilhamento(usuario.mensagem.mensagem);
                        }

                        var nome;
                        if (usuario.isGrupo && usuario.mensagem.nome != null) {
                            nome = $filter('latinize')(usuario.mensagem.nome.toLowerCase());
                        } else if (usuario.mensagem.usuario_nome != null) {
                            nome = $filter('latinize')(usuario.mensagem.usuario_nome.toLowerCase());
                        } else {
                            nome = $filter('latinize')(usuario.mensagem.nome.toLowerCase());
                        }

                        if (nome.indexOf($filter('latinize')($scope.filters.texto)) > -1 &&
                            MensageriaFilter.getInstance('mensageria-filter-geral').filtrar(usuario)) {
                            usuario.exibir = true;
                        } else {
                            usuario.exibir = false;
                        }
                    });

                    _.each($scope.contatos, function (contato) {
                        contato.exibir = false;

                        if (contato.nome.indexOf($scope.filters.texto) > -1 &&
                            MensageriaFilter.getInstance('mensageria-filter-geral').filtrar(contato)) {
                            contato.exibir = true;
                        } else {
                            contato.exibir = false;
                        }
                    })
                }

                MensageriaChatUsuario.on('ocultarContatos', function () {
                    $scope.contatos = [];
                });


                /**
                 * @method _obterContatos
                 */
                function _obterContatos() {
                    return MensageriaService.findContatos(true);
                }

                /**
                 * @method _obterUsuarios
                 */
                function _obterUsuarios() {
                    return MensageriaService.findUsuarios(false);
                }

                /**
                 * @method _obterUsuariosOnline
                 */
                function _obterUsuariosOnline() {
                    return MensageriaService.pegarUsuariosOnline();
                }

                /**
                 * @method _obterGrupos
                 */
                function _obterGrupos() {
                    return MensageriaService.findGruposUsuarios();
                }

                /**
                 * @method _obterGrupo
                 * @param {*} id 
                 */
                function _obterGrupo(id) {
                    return MensageriaService.findGrupo(id);
                }

                /**
                 * @method _novaConversa
                 * @param {*} usuario 
                 */
                function _novaConversa(usuario) {
                    var contato = _.find($scope.contatos, function (contato) { return contato.id === usuario.id && (contato.isGrupo == null || contato.isGrupo == false); });

                    if (contato != null) {
                        usuario.nome = contato.nome;
                        usuario.nome_departamento = contato.nome_departamento;
                        usuario.DepartamentoId = contato.DepartamentoId;
                    }

                    usuario.exibir = true;
                    usuario.online = 1;
                }

                /**
                 * @method _novaConversaRemetente
                 * @param {*} usuario 
                 */
                function _novaConversaRemetente(usuario) {
                    var contato = _.find($scope.contatos, function (contato) { return contato.id === usuario.id && (contato.isGrupo == null || contato.isGrupo == false); });

                    MensageriaService.pegarUsuariosOnline().then(function (usuariosOnlineIds) {

                        if (contato != null) {
                            usuario.nome = contato.nome;
                            usuario.nome_departamento = contato.nome_departamento;
                            usuario.DepartamentoId = contato.DepartamentoId;
                        }

                        var compareUsuariosIds = _.map(usuariosOnlineIds, function (user) {
                            return user;
                        });

                        usuario.exibir = true;
                        if (_.filter(compareUsuariosIds, function (compare) {
                            return compare === usuario.id;
                        }).length > 0) {
                            usuario.online = 1;
                        } else {
                            usuario.online = 0;
                        }

                        if (usuario.isGrupo == true) {
                            usuario.online = 1;
                        }
                    });
                }

                /**
                 * @method _formatDate
                 * @param {*} date 
                 */
                function _formatDate(date) {
                    moment.locale('pt-br', {
                        calendar: {
                            lastWeek: 'DD/MM/YYYY',
                            lastDay: '[Ontem]',
                            sameDay: 'LT',
                            sameElse: 'DD/MM/YYYY'
                        }
                    });
                    return moment(date).calendar();
                }

                /**
                 * @method buscarUsuarios
                 * @param {*} texto 
                 */
                function buscarUsuarios(texto) {

                    var usuarios = [];

                    if ($scope.compartilhando) {
                        var participantes = [];
                        var responsavelProperty = '';

                        if ($scope.compartilhamentoDetalhes.tipoObjeto == 'zonaObservacao' || $scope.compartilhamentoDetalhes.tipoObjeto == 'incidente') {
                            if ($scope.compartilhamentoDetalhes.GruposUsuarios != null && $scope.compartilhamentoDetalhes.GruposUsuarios.Usuarios != null) {
                                participantes = _.chain($scope.compartilhamentoDetalhes.GruposUsuarios.Usuarios)
                                    .map()
                                    .flatten()
                                    .concat($scope.compartilhamentoDetalhes.Usuarios)
                                    .uniqBy('id')
                                    .value();
                            }
                        } else if ($scope.compartilhamentoDetalhes.tipoObjeto == 'baseConhecimento' || $scope.compartilhamentoDetalhes.tipoObjeto == 'planejamento') {
                            if ($scope.compartilhamentoDetalhes.GruposUsuariosParticipantes != null && $scope.compartilhamentoDetalhes.GruposUsuariosParticipantes.Usuarios != null) {
                                participantes = _.chain($scope.compartilhamentoDetalhes.GruposUsuariosParticipantes.Usuarios)
                                    .map()
                                    .flatten()
                                    .concat($scope.compartilhamentoDetalhes.UsuariosParticipantes)
                                    .uniqBy('id')
                                    .value();
                            }
                        }

                        var participantes_ = [];
                        if (participantes != null && participantes.length > 0) {
                            _.each(participantes, function (usuario) {
                                if (usuario != null) {
                                    participantes_.push(usuario);
                                }
                            });
                        }
                        participantes = participantes_;


                        if ($scope.compartilhamentoDetalhes.tipoObjeto == 'incidente') {
                            participantes.push($scope.compartilhamentoDetalhes.Responsavel);
                            responsavelProperty = 'Responsavel';

                            participantes.push($scope.compartilhamentoDetalhes.Owner);
                            responsavelProperty = 'criador';

                        } else {
                            participantes.push($scope.compartilhamentoDetalhes.criador);
                            responsavelProperty = 'criador';
                        }


                        var usuario_ = $scope.usuarios[0];
                        if (usuario_ == null) {
                            setTimeout(function () {
                                buscarUsuarios('');
                            }, 500);
                        }

                        var participantes_ = participantes[0];

                        if (participantes_ == null) {
                            usuarios = $scope.usuarios;
                        } else {
                            _.remove(participantes, { id: $scope.me.id });
                            usuarios = participantes;
                        }

                        _.each(usuarios, function (usuario) {
                            if (usuario != null) {
                                usuario.exibir = true;
                            }
                        });
                    } else {
                        usuarios = $scope.usuarios;
                    }

                    if (!texto) {
                        $scope.selecionados = $scope.usuarios;
                    }

                    texto = $filter('latinize')(texto.toLowerCase());

                    if (texto.lenght == 0) {
                        $scope.selecionados = $scope.usuarios;
                    }

                    $scope.selecionados = [];
                    angular.forEach(usuarios, function (usuario) {

                        var nome;
                        if (usuario.isGrupo) {
                            nome = $filter('latinize')(usuario.mensagem.nome.toLowerCase());
                        } else {
                            nome = $filter('latinize')(usuario.nome.toLowerCase());
                        }

                        if (nome.indexOf(texto) !== -1) {
                            $scope.selecionados.push(usuario);
                        }
                    });

                    return $scope.selecionados;
                }

                /**
                 * @method buscarContatos
                 * @param {*} texto 
                 */
                function buscarContatos(texto) {

                    var contatos = [];

                    if ($scope.compartilhando) {
                        var participantes = [];
                        var responsavelProperty = '';

                        if ($scope.compartilhamentoDetalhes.tipoObjeto == 'zonaObservacao' || $scope.compartilhamentoDetalhes.tipoObjeto == 'incidente') {
                            participantes = _.chain($scope.compartilhamentoDetalhes.GruposUsuarios)
                                .map('Usuarios')
                                .flatten()
                                .concat($scope.compartilhamentoDetalhes.Usuarios)
                                .uniqBy('id')
                                .value();

                        } else if ($scope.compartilhamentoDetalhes.tipoObjeto == 'baseConhecimento' || $scope.compartilhamentoDetalhes.tipoObjeto == 'planejamento') {
                            participantes = _.chain($scope.compartilhamentoDetalhes.GruposUsuariosParticipantes)
                                .map('Usuarios')
                                .flatten()
                                .concat($scope.compartilhamentoDetalhes.UsuariosParticipantes)
                                .uniqBy('id')
                                .value();
                        }

                        if ($scope.compartilhamentoDetalhes.tipoObjeto == 'incidente') {
                            participantes.push($scope.compartilhamentoDetalhes.Responsavel);
                            responsavelProperty = 'Responsavel';
                        } else {
                            participantes.push($scope.compartilhamentoDetalhes.criador);
                            responsavelProperty = 'criador';
                        }

                        if (!participantes.length || (participantes.length == 1 &&
                            $scope.compartilhamentoDetalhes[responsavelProperty])) {
                            contatos = $scope.contatos;
                        } else {
                            _.remove(participantes, { id: $scope.me.id });
                            usuarios = participantes;
                        }

                        _.each(contatos, function (contato) {
                            contato.exibir = true;
                        });
                    } else {
                        contatos = $scope.contatos;
                    }

                    if (!texto) {
                        return contatos;
                    }

                    texto = $filter('latinize')(texto.toLowerCase());

                    return _.filter(contatos, function (contato) {
                        return _.includes($filter('latinize')(contato.nome.toLowerCase()), texto);
                    });
                }

                $scope.toTrustedHTML = function (html) {
                    return $sce.trustAsHtml(html);
                }

                /**
                 * @method abrirChatUsuario
                 * @param {*} usuario 
                 */
                function abrirChatUsuario(usuario) {
                    if (!usuario.isGrupo) {
                        if (usuario != null && usuario.mensagem != null && usuario.mensagem.usuario != null && usuario.mensagem.destinatario) {
                            MensageriaService.atualizarMensagensLidas(usuario.mensagem.usuario, usuario.mensagem.destinatario);
                        } else if (usuario != null && usuario.id != null) {
                            MensageriaService.atualizarMensagensLidas(usuario.id, null);
                        }
                        if (usuario.novasMensagens != null && usuario.novasMensagens > 0) {
                            MensageriaManager.countMsgs -= usuario.novasMensagens;
                        }
                        _.each($scope.unreadMessages, function (unread) {
                            if (usuario.mensagem != null
                                && usuario.mensagem.usuario != null
                                && usuario.mensagem.destinatario != null
                                && unread.remetente != null
                                && unread.destinatario != null
                                && unread.remetente == usuario.mensagem.usuario
                                && unread.destinatario == usuario.mensagem.destinatario) {
                                MensageriaManager.countMsgs -= unread.countMessages;
                                unread.countMessages = 0;
                            }
                        });
                        // quando o cara clicar, diminui as mensagens nao lidas e new message
                        usuario.newMessage = [];
                        if (MensageriaManager.countMsgs > 0) {
                            document.title = '(' + MensageriaManager.countMsgs + ') S4C';
                        } else {
                            document.title = 'S4C';
                        }
                        usuario.novasMensagens = 0;

                        if ($scope.compartilhando) {
                            $scope.compartilharScreen = true;
                            $scope.compartilharTipo = 'usuario';
                            $scope.compartilharNext = usuario;
                        } else {
                            $scope.usuarioChat = usuario;
                            $scope.state.chatGrupoAtivo = false;
                            $scope.state.chatUsuarioAtivo = true;
                        }
                    }
                    else {
                        abrirChatGrupo(usuario);
                    }
                }

                /**
                 * @method abrirChatGrupo
                 * @param {*} usuario 
                 */
                function abrirChatGrupo(usuario) {
                    if (usuario.newMessage != null && usuario.newMessage.length > 0) {
                        MensageriaManager.countMsgs -= usuario.newMessage.length;
                    }
                    _.each($scope.unreadMessagesGroup, function (unread) {
                        if (usuario.mensagem != null
                            && usuario.mensagem.id != null
                            && unread.idGrupo != null
                            && unread.idGrupo == usuario.mensagem.id) {
                            MensageriaManager.countMsgs -= unread.countMessages;
                            unread.countMessages = 0;
                        }
                    });

                    // Limpa a bolinha azul com a numeração de novas mensagens
                    usuario.newMessage = [];
                    if (MensageriaManager.countMsgs > 0) {
                        document.title = '(' + MensageriaManager.countMsgs + ') S4C';
                    } else {
                        document.title = 'S4C';
                    }
                    usuario.novasMensagens = 0;
                    var grupo = (usuario.mensagem || usuario);
                    MensageriaService.atualizarMensagensLidasGrupo($scope.me.id, grupo.id);
                    if ($scope.compartilhando) {
                        $scope.compartilharScreen = true;
                        $scope.compartilharTipo = 'grupo';
                        $scope.compartilharNext = grupo;
                    } else {
                        $scope.grupoChat = grupo;
                        $scope.state.chatGrupoAtivo = true;
                        $scope.state.chatUsuarioAtivo = false;
                    }
                }
            }
        }
    }
}());