var EditarUsuarioController = ControllerBase.extend({

    framework: 'knockout',

    ajax: function () {

        return {
            url: '/Usuario/_Editar',
            type: 'post',
            cache: false,
            data: {
                codigo: this.codigoUsuario
            }
        };
    },

    antesBinding: function () {

        this.appendToModel({ name: 'permissoes', value: [{ Descricao: 'Permitido', Valor: true }, { Descricao: 'Não Permitido', Valor: false }] });
        this.appendToModel({ name: 'grupoSelecionado', value: false });
        this.appendToModel({ name: 'gruposPrincipais', value: [] });
        this.appendToModel({ name: 'gruposSelecionados', value: [] });
        this.appendToModel({ name: 'tipoModal' });

    },

    moduloExpandido: function (model) {
        return model.expandido && model.expandido();
    },

    funcionalidadeExpandida: function (model) {
        return model.expandido && model.expandido();
    },

    expandir: function (model) {

        if (!model.expandido) {
            model.expandido = ko.observable(false);
        }

        model.expandido(!model.expandido());
    },

    expandido: function (model) {
        return model.expandido && model.expandido();
    },

    acaoSelecionada: function (model) {

        if (!this.model.Acoes || !this.model.Acoes() || this.model.Acoes().length == 0) {
            return false;
        }

        var self = this;

        var selecionado = false;

        $.each(this.model.Acoes(), function () {

            if (this.Codigo == model.Codigo) {
                selecionado = true;
                return false;
            }

        });

        return selecionado;

    },

    selecionarGrupo: function (model) {

        if (!this.quantidadeGruposSelecionados) {
            this.quantidadeGruposSelecionados = 0;
        }

        model.selecionado(!model.selecionado());

        this.quantidadeGruposSelecionados = this.quantidadeGruposSelecionados + (model.selecionado() ? 1 : -1);

        this.model.grupoSelecionado(this.quantidadeGruposSelecionados > 0);
    },

    alterarGrupoPrincipal: function (model) {

        this.model.gruposSelecionados.removeAll();

        var self = this;

        global.ajax({
            url: '/Usuario/ListarGruposPrincipais',
            type: 'post',
            success: function (data) {

                var arr = ko.mapping.fromJS(data)();
                self.model.gruposPrincipais(arr);
                self.model.tipoModal('grupoPrincipal');
                $('#modalGrupos').modal();

            }
        });

    },

    incluirGrupo: function () {


        this.model.gruposSelecionados.removeAll();

        var self = this;

        global.ajax({
            url: '/Usuario/ListarGruposPrincipais',
            type: 'post',
            success: function (data) {

                var arr = ko.mapping.fromJS(data)();
                self.model.gruposPrincipais(arr);
                self.model.tipoModal('incluirGrupo');
                $('#modalGrupos').modal();

            }
        });

    },
    
    excluirGrupos: function() {
      
        if (!this.model.Grupos || !this.model.Grupos() || this.model.Grupos().length == 0) {
            return;
        }

        var self = this;

        $.each(this.model.Grupos(), function () {
            if (this.selecionado()) {
                self.excluirGrupo(this);
            }
        });
        
    },

    excluirGrupo: function (model) {
        this.quantidadeGruposSelecionados--;
        this.model.grupoSelecionado(this.quantidadeGruposSelecionados > 0);
        model.Excluido(true);
        model.selecionado(false);
    },

    expandirGrupo: function (model) {

        model.expandido(!model.expandido());

        if (!model.expandido()) return;

        if (model.Grupos && model.Grupos() && model.Grupos().length > 0) return;

        global.ajax({
            url: '/Usuario/ListarGrupos',
            type: 'post',
            data: {
                codigoUsuario: model.Codigo()
            },
            success: function (data) {
                var arr = ko.mapping.fromJS(data)();
                model.Grupos(arr);
            }
        });

    },

    grupoSelecionado: function (model) {

        

        switch (this.model.tipoModal()) {
            case 'incluirGrupo':
                
                if (this.model.Codigo() == model.Codigo()) {
                    global.showErrorMessage('Não é possível incluir o usuário selecionado como grupo dele mesmo.');
                    return false;
                }


                if (model.selecionado()) {
                    this.model.gruposSelecionados.push(model);
                } else {
                    this.model.gruposSelecionados.remove(model);
                }

                break;
            case 'grupoPrincipal':
                
                if (this.model.OidGrupoPrincipal() == model.Codigo()) {
                    global.showErrorMessage('Não é possível definir o usuário selecionado como grupo principal.');
                    return false;
                }


                $.each(this.model.gruposSelecionados(), function () {
                    this.selecionado(false);
                });

                this.model.gruposSelecionados.removeAll();
                this.model.gruposSelecionados.push(model);

                break;
        }

        return true;

    },

    selecionarGrupos: function (model) {

        if (this.model.gruposSelecionados().length > 0) {

            switch (this.model.tipoModal()) {
                case 'incluirGrupo':
                    
                    var self = this;

                    $.each(this.model.gruposSelecionados(), function () {

                        var existe = false;
                        var grupoSelecionado = this;

                        $.each(self.model.Grupos(), function() {
                            if (this.Codigo() == grupoSelecionado.Codigo()) {
                                existe = true;
                                this.Excluido(false);
                            }
                        });
                        
                        this.selecionado(false);

                        if (!existe) {
                            this.novo(true);
                            self.model.Grupos.push(this);
                        }
                    });

                    break;
                case 'grupoPrincipal':
                    var grupo = this.model.gruposSelecionados()[0];
                    this.model.OidGrupoPrincipal(grupo.Codigo());
                    this.model.NomeGrupoPrincipal(grupo.Nome());

                    break;
            }
        }


        $('#modalGrupos').modal('hide');

    },

    salvar: function (model) {

        model = this.toJS(model.model);

        var self = this;

        global.ajax({
            url: '/Usuario/Salvar',
            type: 'post',
            contentType: 'application/json',
            data: JSON.stringify({
                usuario: model
            }),
            success: function (data) {

                global.showSuccessMessage('Usuário editado com sucesso.');

                if (self.sairEdicaoCallback) {
                    self.sairEdicaoCallback();
                }
            }
        });

    },
    
    cancelar: function() {
        if (this.sairEdicaoCallback) {
            this.sairEdicaoCallback();
        }
    }

});