var EditarPermissoesFuncionalidadeController = ControllerBase.extend({
    
    framework: 'knockout',

    ajax: function() {

        return {
            url: '/Funcionalidade/_EditarPermissoes',
            type: 'post',
            cache: false,
            data: {
                codigoFuncionalidade: this.codigo
            }
        };
    },
    
    renderizado: function() {
        $('aside[aside-direita="permissoesGrupo"]').show();
    },
    
    onhide: function () {
        $('aside[aside-direita="permissoesGrupo"]').hide();
    },
    
    antesBinding: function() {

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

    },
    
    aposBinding: function() {

        var aside = $('aside[aside-direita="permissoesGrupo"]');
        aside.empty();
        aside.append($('[aside]', this.region.$el));
    },
    
    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);
            }
        });

    },
    

    selecionarGrupo: function(model, el) {
        
        if (this.model.elementoSelecionado()) {
            $(this.model.elementoSelecionado()).css('color', '');
        }
        
        if (this.model.grupoSelecionado() && this.model.grupoSelecionado().Codigo() == model.Codigo()) {

            this.model.grupoSelecionado(undefined);
            this.model.possuiGrupoSelecionado(false);
            return;
        }

        var self = this;
        
        global.ajax({
            url: '/Funcionalidade/ListarAcoesFuncionalidadeUsuario',
            type: 'post',
            data: {
                codigoUsuario: model.Codigo(),
                codigoFuncionalidade: this.model.Codigo()
            },
            success: function (data) {
                var arr = ko.mapping.fromJS(data)();
                self.model.acoesFuncionalidade(arr);
                

                self.model.elementoSelecionado(el.target);
                $(self.model.elementoSelecionado()).css('color', '#2a6496');
                self.model.grupoSelecionado(model);
                self.model.possuiGrupoSelecionado(true);

            }
        });
        
    },
    
    aplicar: function() {
        
        if (!this.model.grupoSelecionado() || !this.model.acoesFuncionalidade() || this.model.acoesFuncionalidade().length == 0) {
            return;
        }

        var acoes = this.toJS(this.model.acoesFuncionalidade());

        var self = this;

        global.ajax({
            url: '/Funcionalidade/SalvarPermissoesAcoesFuncionalidade',
            type: 'post',
            contentType: 'application/json',
            data: JSON.stringify({
                codigoUsuario: this.model.grupoSelecionado().Codigo(),
                codigoFuncionalidade: this.model.Codigo(),
                acoes: acoes
            }),
            success: function (data) {
                global.showSuccessMessage("Permissões aplicadas com sucesso.");
                self.cancelar();
            }
        });


    },
    
    cancelar: function() {
        
        if (this.model.elementoSelecionado()) {
            $(this.model.elementoSelecionado()).css('color', '');
        }

        if (this.model.grupoSelecionado()) {

            this.model.grupoSelecionado(undefined);
            this.model.possuiGrupoSelecionado(false);
            return;
        }

    }

});