Source: components/admin/controllers/usuarios_agencias_perfis.controller.js

/**
 * @ngdoc controllers
 * @name UsuarioAgenciaPerfil
 * @module s4c.components.admin.controllers.UsuarioAgenciaPerfil
 *
 * @description
 * `AdminUsuarioAgenciaPerfilCtrl` Controller da tela de integração Usuário e Perfis do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    function AdminUsuarioAgenciaPerfilCtrl($scope, $http, $q, $mdDialog, API_ENDPOINT,
        Usuario, Departamento, PermissaoAcesso, Perfil, GrupoMensageria,
        Base, localize, FileUploader, MainService, $filter, AuthService, MainState) {


        $scope.res = $scope.$root.res;
        $scope.user = {};

        function abrirUpload() {
            $scope.input = angular.element('input.uploadArquivo');
            $scope.input.click();
        }

        var uploader = $scope.uploader = new FileUploader(),
            uploadCallbackQueue = [];

        uploader.clearQueue();

        $scope.uploader.filters.push({
            'name': 'enforceMaxFileSize',
            'fn': function (item, evt) {
                var megaByte = parseInt(item.size / 1000000) + "MB";
                if (item.size <= 26214400) {
                    return item.size <= 26214400
                } else {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_TAMANHOFILEULTRAPASSADO'))
                            .content($scope.res('LIMITE_ARQUIVO_ULTRAPASSADO', megaByte))
                            .ok($scope.res('COMUM_OK')))
                    return item.size <= 26214400
                }
            }
        });

        $scope.uploader.onCompleteItem = function (item, response) {
            $scope.mensagem = response;
        };

        $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
            item.novoNome = item.file.name;
            enviarArquivo();
        }

        function ext(filename) {
            var index = _.lastIndexOf(filename, '.');
            return filename.substring(index, filename.length);
        }

        $scope.uploader.onBeforeUploadItem = function (item) {
            item.url = uploader.url;
            var token = window.sessionStorage.getItem('s4cToken');
            var tokenObj = JSON.parse(token);
            item.headers = {
                'Authorization': 'Bearer ' + tokenObj.access_token
            };
            item.file.name = item.novoNome + ext(item.file.name);
        };

        $scope.uploader.onProgressItem = function (fileItem, progress) {
            console.info('onProgressItem', fileItem, progress);
        };

        $scope.uploader.onCompleteAll = function (result) {
            _.each(uploadCallbackQueue, function (callback) {
                callback();
            });
        };


        $scope.mostrarImagem = function () {
            $('#arquivo').each(function (index) {
                if ($('#arquivo').eq(index).val() != "") {
                    $scope.readURL(this);
                }
            });
        }


        $scope.hasImage = false;
        function removeImage() {

            $scope.hasImage = false;
        }

        $scope.readURL = function (input) {
            if (input.files && input.files[0]) {
                $scope.hasImage = true;
                var reader = new FileReader();
                reader.onload = function (e) {
                    $("#renderCropper").empty();
                    var img = $('<img />',
                        {
                            id: 'image',
                            src: e.target.result,
                            style: 'width: 100%'
                        }).appendTo($('#renderCropper'));
                    var cropper = new Cropper(img[0], {
                        aspectRatio: 1,
                        crop: function (e) {
                            document.getElementById('editarX').value = e.detail.x;
                            document.getElementById('editarY').value = e.detail.y;
                            document.getElementById('editarWidth').value = e.detail.width;
                            document.getElementById('editarHeight').value = e.detail.height;
                        },
                        zoomable: true,
                        scalable: true,
                        movable: true,
                        background: false,
                        viewMode: 1
                    });
                };
                reader.readAsDataURL(input.files[0]);
            }
        }

        $scope.isToShow = function (label) {
            return MainState.isToShow(label);
        }

        function enviarArquivo() {
            $scope.mostrarImagem();
        }

        $scope.uploader.alias = 'arquivo';
        $scope.uploader.removeAfterUpload = true;

        function toBlob() {

            var canvas = document.createElement('canvas');
            var ctx = canvas.getContext('2d');
            canvas.height = document.getElementById('editarHeight').value;
            canvas.width = document.getElementById('editarWidth').value;

            if (!document.getElementById('image') || !$scope.hasImage) {
                return;
            }
            ctx.drawImage(document.getElementById('image'), document.getElementById('editarX').value, document.getElementById('editarY').value, canvas.width, canvas.height, 10, 10, canvas.width, canvas.height);

            if (canvas.toBlob) {
                canvas.toBlob(function (blob) {
                    var formData = new FormData();

                    var token = window.sessionStorage.getItem('s4cToken');
                    var tokenObj = JSON.parse(token);

                    formData.append('arquivo', blob, "avatar.png");
                    $.ajax('/usuarios/' + $scope.user.id, {
                        method: "POST",
                        data: formData,
                        processData: false,
                        contentType: false,
                        headers: {
                            'Authorization': 'Bearer ' + tokenObj.access_token
                        },
                        success: function (data) {
                            var usuarioIdSessao = $.parseJSON(sessionStorage.s4cToken).usuario.id;

                            $scope.user.urlImagem = data.imgUrl;
                            if ($scope.usuarioSelecionado.id == $scope.user.id) {
                                $scope.usuarioSelecionado.urlImagem = data.imgUrl;
                            }

                            if ($scope.user.id == usuarioIdSessao) {
                                $('.imagem-usuario').attr("src", data.imgUrl);
                                AuthService.getUserInfo().then(function (usuario) {
                                    usuario.urlImagem = data.imgUrl;
                                });
                            }
                        },
                        error: function () {
                            console.log('Upload error');
                        }
                    });
                });
            }
        }

        function NovoDepartamentoCtrl($scope, $mdDialog, Base, departametoArray) {

            $scope.res = $scope.$root.res;
            $scope.departamento;
            /**
             * @method criarDepartamento
             */
            $scope.criarDepartamento = function () {

                $scope.departamento.$error = false;
                $scope.nomeExists = false;

                if (_.includes(_.map($scope.departamentos, 'nome'), $scope.departamento.nome)) {
                    $scope.nomeExists = true;
                }

                if (!$scope.nomeExists) {

                    Departamento.crud().save($scope.departamento).$promise.
                        then(function (departamento) {

                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_SUCESSO'))
                                    .content(localize.getLocalizedString("COMUM_DEPARTAMENTO_SINGULAR_CAPS") + localize.getLocalizedString('CRIADA_COM_SUCESSO'))
                                    .ok($scope.res('COMUM_OK')));

                            $mdDialog.hide();

                            var dep = { id: departamento.id, nome: departamento.nome }
                            departametoArray.push(dep);

                        }, function (err) {
                            $scope.departamento.$error = true;
                        });
                }
            }

            /**
             * @method cancelarDepartamento
             */
            $scope.cancelarDepartamento = function () {
                $mdDialog.hide();
            };

            $scope.departamento = {};
        }

        /**
         * @method sincronizarLDAP
         */
        function sincronizarLDAP() {
            $("#sincronizarLDAP").prop('disabled', true);

            Base.obter('ldap/sync').then(function () {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_SUCESSO'))
                        .content(' sincronização efetuada com sucesso.')
                        .ok($scope.res('COMUM_OK')));
                $("#sincronizarLDAP").prop('disabled', false);
            });
        }

        $scope.departamentoSelecionado;
        $scope.isAdding = false;
        $scope.isEdition = false;
        /**
         * @method novoUsuario
         * @param {*} event 
         */
        function novoUsuario(event) {
            $scope.cancelado = false;
            $scope.isAdding = true;
            $scope.isEdition = false;
            $scope.user = {};
            $scope.perfilGrupos = [];
        }

        $scope.user;
        /**
         * @method editarUsuario
         */
        function editarUsuario() {
            $scope.cancelado = false;
            $scope.isAdding = false;
            $scope.isEdition = true;
            $scope.user = angular.copy($scope.usuarioSelecionado);
            if ($scope.user.urlImagem != null) {
                $scope.hasImage = true;
            } else {
                $scope.hasImage = false;
            }
            $scope.departamentoSelecionado = $scope.user.DepartamentoId;
        }

        /**
         * @method novoDepartamento
         * @param {*} event 
         */
        function novoDepartamento(event) {
            $mdDialog.show({
                templateUrl: 'app/components/admin/modulos/usuarios/Departamento/novo_departamento.html',
                controller: NovoDepartamentoCtrl,
                locals: {
                    departametoArray: $scope.departamentos
                }
            });
        }

        /**
         * @method editDepartamento
         * @param {*} event 
         * @param {*} departamentoId 
         */
        function editDepartamento(event, departamentoId) {
            $mdDialog.show({
                templateUrl: 'app/components/admin/modulos/usuarios/Departamento/editar.html',
                controller: EditDepartamentoCtrl,
                locals: {
                    departamentoId: departamentoId
                }
            });
        }

        /**
         * @method deleteDepartamento
         * 
         * @param {*} event 
         * @param {*} departamento 
         */
        function deleteDepartamento(event, departamento) {
            var confirm = $mdDialog.confirm()
                .title($scope.res('COMUM_MENSAGEMCONFIRMACAODELETAR') + ' ' + $scope.res("COMUM_DEPARTAMENTO_SINGULAR") + ' ' + departamento.nome + ' ?')
                .content($scope.res('COMUM_MENSAGEM_ACAOIRREVERSIVEL'))
                .ariaLabel($scope.res('COMUM_DELETAR') + ' ' + $scope.res('COMUM_GRUPO'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'))
                .targetEvent(event);

            $mdDialog.show(confirm).then(function () {
                var promises = [];

                GrupoMensageria.queryByDepartamento(departamento.id)
                    .then(function (grupos) {
                        grupos.forEach(function (grupo) {
                            promises.push(GrupoMensageria.remove(grupo.id));
                        });

                        $q.all(promises)
                            .then(function () {
                                Departamento.crud().delete({
                                    id: departamento.id
                                })
                                    .$promise.then(function () {
                                        popularDepartamentos();
                                    })
                            });

                    }, function (err) {
                        alert($scope.res('COMUM_HOUVEUMERROAODELETAR') + ' ' + $scope.res("COMUM_DEPARTAMENTO_SINGULAR") + '. ' + $scope.res('COMUM_DEVEHAVERUSUARIOSOUPERMISSOESVINCULADAS'));
                    });
            }, function (err) {
                console.log(err);
            });
        }

        $scope.data = {selected:'true'};
        $scope.activeSelected = true;
        $scope.usuariosSelecionados = [];
        /**
         * @method popularUsuarios
         */
        function popularUsuarios() {
            Usuario.obterShortUsers().then(function (usuarios) {

                $scope.usuarios = usuarios;
                $scope.usuariosSelecionados = angular.copy($scope.usuarios);
                filtrarUsuariosPorAtivo();
                popularGrupoUsuarios();
            });
        }

        /**
         * @method filtrarUsuariosPorAtivo
         */
        function filtrarUsuariosPorAtivo(){
            $scope.usuariosSelecionados = _.filter($scope.usuariosSelecionados, function(usuario){
                return usuario.ativo;
            });
        }

        /**
         * @method activate
         */
        $scope.activate = function(value){
            $scope.activeSelected = value;
            $scope.usuariosSelecionados = _.filter(angular.copy($scope.usuarios), function(usuario){
                return usuario.ativo == value;
            });
        }

        $scope.grupoUsuarios = [];
        /**
         * @method popularGrupoUsuarios
         */
        function popularGrupoUsuarios() {

            $http.get(API_ENDPOINT + 'grupo_usuarios/adm')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.grupoUsuarios = response.data;

                    } else {
                        $scope.grupoUsuarios = [];
                    }
                });
        }


        $scope.perfis = [];
        $scope.mostrarIcone = false;
        /**
         * @method carregarPerfis
         * @param {*} grupoSelecionado 
         */
        function carregarPerfis(grupoSelecionado) {

            $scope.perfis = [];
            $scope.perfilSelecionado = {};
            $scope.mostrarIcone = false;
            $scope.grupoSelecionado = angular.copy(grupoSelecionado);

            var deferred = $q.defer();
            var url = 'perfil/grupo_usuario/' + $scope.grupoSelecionado.id;

            $http.get(API_ENDPOINT + url)
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.perfis = _.map(response.data, function (perfil) {

                            response.data = _.filter(response.data, function (perfil) {
                                return perfil.GrupoUsuarioId == $scope.grupoSelecionado.id;
                            })
                            return {
                                id: perfil.id,
                                nome: perfil.nome,
                                grupoUsuarioId: perfil.GrupoUsuarioId
                            };
                        });

                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method removerLinha
         * @param {*} perfilGrupo 
         */
        function removerLinha(perfilGrupo) {
            $scope.perfilGrupos.splice($scope.perfilGrupos.indexOf(perfilGrupo), 1);
        }

        $scope.perfilGrupos = [];
        /**
         * @method addInTable
         */
        function addInTable() {

            var temRepetido = false;
            angular.forEach($scope.perfilGrupos, function (perfilGrupo) {

                if (perfilGrupo.perfil.id == $scope.perfilSelecionado.id) {
                    temRepetido = true;
                }
            });

            if (temRepetido) {
                return;
            }

            var perfilGrupo = {
                grupo: $scope.grupoSelecionado,
                perfil: $scope.perfilSelecionado
            }

            $scope.perfilGrupos.push(perfilGrupo);
            $scope.perfilSelecionado = {};
            $scope.grupoSelecionado = {};

            $scope.mostrarIcone = false;
        }

        $scope.perfilSelecionado;
        /**
         * @method selecionarPerfil
         * @param {*} perfilSelecionado 
         */
        function selecionarPerfil(perfilSelecionado) {
            $scope.perfilSelecionado = angular.copy(perfilSelecionado);
            $scope.mostrarIcone = true;
        }

        /**
         * @method isLdapLogin
         */
        function isLdapLogin() {
            Base.obter('ldap/authenticatedUser').then(function (response) {
                if (response.ldapAuthenticatedUser != null && response.ldapAuthenticatedUser) {
                    $scope.isLdapAuthenticatedUser = true;
                } else {
                    $scope.isLdapAuthenticatedUser = false;
                }
            });
        }

        /**
         * @method selecionarDepartamento
         */
        function selecionarDepartamento(departamentoSelecionado) {
            $scope.user.DepartamentoId = departamentoSelecionado;

            angular.forEach($scope.departamentos, function (dep) {

                if (dep.id == departamentoSelecionado) {
                    $scope.user.departamentoNome = dep.nome;
                }
            });
        }

        $scope.departamentos = [];
        /**
         * @method popularDepartamentos
         */
        function popularDepartamentos() {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'departamentos/')
                .then(function (response) {
                    if (typeof response.data === 'object') {

                        $scope.departamentos = _.map(response.data, function (departamento) {
                            return {
                                id: departamento.id,
                                nome: departamento.nome
                            };
                        });

                        deferred.resolve();

                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method reativar
         */
        $scope.reativar = function(){
            Usuario.ativar($scope.usuarioSelecionado.id).then(function(response){
                $scope.usuarioSelecionado.ativo = true;
                $scope.usuariosSelecionados.splice($scope.usuariosSelecionados.indexOf($scope.usuarioSelecionado), 1);
                for (var index in $scope.usuarios) {
                    if ($scope.usuarios[index].id == $scope.usuarioSelecionado.id) {
                        $scope.usuarios[index].ativo = true;
                        break;
                    }
                }
                cancelar();
            });
        }

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

            $scope.cpfExists = false;
            $scope.emailExists = false;
            $scope.usernameExists = false;

            if (!$scope.user.DepartamentoId) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('DEPARTAMENTO_OBRIGATORIO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            angular.forEach($scope.usuarios, function (usuario) {

                if (usuario.username == $scope.user.username && usuario.id != $scope.user.id) {
                    $scope.usernameExists = true;
                }

                if (usuario.email == $scope.user.email && usuario.id != $scope.user.id) {
                    $scope.emailExists = true;
                }

                if (usuario.cpf == $scope.user.cpf && usuario.id != $scope.user.id) {
                    $scope.cpfExists = true;
                }
            });

            if (!$scope.perfilGrupos || $scope.perfilGrupos.length == 0) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('PERFIL_OBRIGATORIO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if (!$scope.usernameExists && !$scope.emailExists && !$scope.cpfExists && $scope.isAdding) {

                if (!$scope.user.password) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content($scope.res('USUARIO_SENHA_OBRIGATORIA'))
                            .ok($scope.res('COMUM_OK')));
                    return;
                }

                $scope.user.perfilGrupos = $scope.perfilGrupos;
                Usuario.salvar($scope.user).then(function (u) {

                    if (!u.id) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content($scope.res(u.Status))
                                .ok($scope.res('COMUM_OK')));
                        return;
                    }

                    $scope.user.id = u.id;
                    if (!$scope.user.grupoUsuarios) {
                        $scope.user.grupoUsuarios = {};
                    }

                    //Tem que adicionar nas duas listas.
                    $scope.usuarios.push($scope.user);
                    $scope.usuariosSelecionados.push($scope.user);

                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('USUARIO_USUARIO') + ' ' + $scope.res('COMUM_MENSAGEMCRIADOCOMSUCESSO'))
                            .ok($scope.res('COMUM_OK')));

                    selecionarUsuario($scope.user);
                    $scope.isAdding = false;
                    $scope.cancelado = true;
                    toBlob();
                    if (MainState.getDirective('MensageriaConversas')) {
                        MainState.getDirective('MensageriaConversas').reloadContacts();
                    }

                });

                $scope.hasImage = false;

            } else if ($scope.isEdition && !containsUserName()) {

                $scope.user.perfilGrupos = $scope.perfilGrupos;
                Usuario.atualizar($scope.user.id, $scope.user).then(function (user) {

                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('USUARIO_ATUALIZADO'))
                            .ok($scope.res('COMUM_OK')));

                    //Não remover este código. Nome do usuário não é atualizado na lista sem ele.
                    for (var index in $scope.usuariosSelecionados) {
                        if ($scope.usuariosSelecionados[index].id == $scope.user.id) {
                            $scope.usuariosSelecionados.splice(index, 1);
                            break;
                        }
                    }

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

                    $scope.usuarioSelecionado = $scope.user;
                    $scope.usuariosSelecionados.push($scope.usuarioSelecionado);
                    $scope.usuarios.push($scope.usuarioSelecionado);

                    selecionarUsuario($scope.user);
                    $scope.isEdition = false;
                    $scope.cancelado = true;
                    toBlob();

                    $scope.hasImage = false;
                    if (MainState.getDirective('MensageriaConversas')) {
                        MainState.getDirective('MensageriaConversas').reloadContacts();
                    }
                });
            }

        }

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

            var contains = false;
            angular.forEach($scope.usuarios, function (usuario) {

                if ($scope.user.id != usuario.id &&
                    ($scope.user.username == usuario.username || $scope.user.email == usuario.email || $scope.user.cpf == usuario.cpf)) {
                    contains = true;
                }

            });

            return contains;
        }

        $scope.cancelado = true;
        /**
         * @method cancelar
         */
        function cancelar() {
            $scope.cancelado = true;
            $scope.isAdding = false;
            $scope.isEdition = false;
            $scope.grupoSelecionado = null;
            $scope.perfilSelecionado = null;
            $scope.perfilGrupos = angular.copy($scope.usuarioSelecionado.perfilGrupos);
        }

        /**
         * @method formatarCPF
         * @param {*} cpf 
         */
        function formatarCPF(cpf) {
            var str = cpf + '';
            if (str.length <= 11) {
                str = str.replace(/\D/g, '');
                str = str.replace(/(\d{3})(\d)/, "$1.$2");
                str = str.replace(/(\d{3})(\d)/, "$1.$2");
                str = str.replace(/(\d{3})(\d{1,2})$/, "$1-$2");
            }
            return str;
        };

        /**
         * @method filterValue
         * @param {*} $event 
         */
        function filterValue($event) {
            if (isNaN(String.fromCharCode($event.keyCode))) {
                $event.preventDefault();
            }
        };

        /**
         * @method formatarTel
         * @param {*} telefone 
         */
        function formatarTel(telefone) {

            var tel = telefone + '';
            tel = tel.replace(/\D/g, "");
            tel = tel.replace(/^(\d{2})(\d)/g, "($1) $2");
            tel = tel.replace(/(\d)(\d{4})$/, "$1-$2");
            return tel;
        }

        $scope.textoBusca;
        /**
         * @method executeSearch
         * @param {*} e 
         */
        function executeSearch(e) {
            $scope.usuariosSelecionados = [];
            var texto = $scope.textoBusca.toLowerCase();

            var usuariosFiltrados = _.filter($scope.usuarios, function(usuario){
                return usuario.ativo == $scope.activeSelected;
            });
            angular.forEach(usuariosFiltrados, function (usuario) {

                var nome = usuario.nome.toLowerCase();
                var username = usuario.username.toLowerCase();

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

        $scope.usuarioSelecionado = undefined;
        $scope.detalhesUsuario = false;
        /**
         * @method selecionarUsuario
         * @param {*} usuario 
         */
        function selecionarUsuario(usuario) {

            Usuario.obterUsuario(usuario.id).then(function (usuarioFull) {

                usuario = usuarioFull;
                $scope.isAdding = false;
                $scope.isEdition = false;
                $scope.cancelado = true;
                $scope.detalhesUsuario = true;

                if ($scope.usuarioSelecionado === undefined) {

                    $scope.usuarioSelecionado = usuario;
                    $scope.usuarioSelecionado.val = true;

                } else {

                    $scope.usuarioSelecionado.val = false;
                    $scope.usuarioSelecionado = usuario;
                    usuario.val = true;
                }

                $scope.perfilGrupos = angular.copy($scope.usuarioSelecionado.perfilGrupos);

                angular.forEach($scope.usuarioSelecionado.grupoUsuarios, function (grupoUsuario) {

                    if (!grupoUsuario.perfis) {

                        var deferred = $q.defer();
                        var url = 'perfil/grupo_usuario/' + grupoUsuario.id;

                        $http.get(API_ENDPOINT + url)
                            .then(function (response) {

                                grupoUsuario.perfis = response.data;

                            }, function (response) {
                                return deferred.reject(response.data);
                            });

                        return deferred.promise;
                    }
                });

            });
        }

        /**
         * @method removerUsuario
         * @param {*} usuario 
         */
        function removerUsuario(usuario) {

            var confirm = $mdDialog.confirm()
                .title($scope.res('COMUM_REMOVER'))
                .content($scope.res('REMOVER_USUARIO'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'));

            $mdDialog.show(confirm).then(function () {

                Usuario.remover(usuario.id)
                    .then(function () {

                        $mdDialog.hide();
                        var dialog = $mdDialog;
                        dialog
                            .show(dialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('REMOVER_USUARIO_SUCESSO'))
                                .ok($scope.res('COMUM_OK')));

                        for (var index in $scope.usuariosSelecionados) {
                            if ($scope.usuariosSelecionados[index].id == usuario.id) {
                                $scope.usuariosSelecionados[index].ativo = false;
                                $scope.usuariosSelecionados.splice(index, 1);
                                break;
                            }
                        }

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

                        if ($scope.usuarioSelecionado && $scope.usuarioSelecionado.id == usuario.id) {

                            $scope.usuarioSelecionado = undefined;
                            $scope.user = undefined;

                            $scope.detalhesUsuario = false;
                            $scope.isEdition = false;
                        }

                        if (MainState.getDirective('MensageriaConversas')) {
                            MainState.getDirective('MensageriaConversas').reloadContacts();
                        }

                    }, function (err) {
                        $mdDialog.hide();
                    });

            }, function () {
                console.log('cancel');
            });

        }

        /**
         * @method resetarSenha
         * @param {*} usuario 
         */
        function resetarSenha(usuario) {
            $mdDialog.show({
                controller: function ($scope, $mdDialog) {
                    $scope.res = $scope.$root.res;
                    $scope.salvar = function (senha) {
                        if ($scope.resetarSenha.$valid) {
                            $mdDialog.hide(senha);
                        }
                    };

                    $scope.cancelar = function () {
                        $mdDialog.hide();
                    };
                },
                templateUrl: 'app/components/admin/modulos/usuarios/Usuario/nova_senha.html'
            })
                .then(function (password) {

                    if (!password) {
                        return;
                    }

                    AuthService.resetUserPassword(usuario.id, password)
                        .then(function (usuario) {
                            $mdDialog.hide();
                            var dialog = $mdDialog;
                            dialog
                                .show(dialog.alert()
                                    .title($scope.res('COMUM_SUCESSO'))
                                    .content($scope.res('RESET_SENHA'))
                                    .ok($scope.res('COMUM_OK')));
                        }, function (err) {
                            $mdDialog.hide();
                        });
                }, function () { });
        }

        angular.extend($scope, {
            formatarCPF: formatarCPF,
            salvarUsuario: salvarUsuario,
            cancelar: cancelar,
            carregarPerfis: carregarPerfis,
            selecionarPerfil: selecionarPerfil,
            addInTable: addInTable,
            removerLinha: removerLinha,
            executeSearch: executeSearch,
            formatarTel: formatarTel,
            editarUsuario: editarUsuario,
            selecionarUsuario: selecionarUsuario,
            sincronizarLDAP: sincronizarLDAP,
            novoUsuario: novoUsuario,
            novoDepartamento: novoDepartamento,
            editDepartamento: editDepartamento,
            deleteDepartamento: deleteDepartamento,
            selecionarDepartamento: selecionarDepartamento,
            abrirUpload: abrirUpload,
            filterValue: filterValue,
            resetarSenha: resetarSenha,
            removerUsuario: removerUsuario,
            removeImage: removeImage
        });

        popularDepartamentos()
            .then(function () {
                popularUsuarios();
            });

        isLdapLogin();
    }

    AdminUsuarioAgenciaPerfilCtrl.$inject = [
        '$scope',
        '$http',
        '$q',
        '$mdDialog',
        'API_ENDPOINT',
        'Usuario',
        'Departamento',
        'PermissaoAcesso',
        'Perfil',
        'GrupoMensageria',
        'Base',
        'localize',
        'FileUploader',
        'MainService',
        '$filter',
        'AuthService',
        'MainState'

    ];

    angular.module('s4c.controllers.AdminUsuarioAgenciaPerfilCtrl', [
        'ngMaterial',
        's4c.services.Usuario',
        's4c.services.Departamento',
        's4c.services.GrupoMensageria'
    ])
        .controller('AdminUsuarioAgenciaPerfilCtrl', AdminUsuarioAgenciaPerfilCtrl);

}());