/* global angular, page_title */

angular.module("app").controller('RolesListCtrl', [
    '$scope',
    '$state',
    '$window',
    'RolesService',
    'PermisosService',
    'ModulosAccionesRolesService',
    function ($scope, $state, $window, RolesService, PermisosService, ModulosAccionesRolesService) {
        $window.document.title = page_title + " :: Roles";
        localStorage.setItem("app_last_state", JSON.stringify({state: $state.current.name, params: null}));
        $scope.show_list = false;
        $scope.roles = [];
        $scope.permisos = [];
        getAllPermisos();
        $scope.mostrarUsuarios = function (puesto) {
            puesto.show_usuarios = true;
            puesto.show_modulos = false;
        };
        $scope.ocultarUsuarios = function (puesto) {
            puesto.show_usuarios = false;
            puesto.show_modulos = false;
        };
        $scope.mostrarModulos = function (puesto) {
            puesto.show_modulos = true;
            puesto.show_usuarios = false;
        };
        $scope.ocultarModulos = function (puesto) {
            puesto.show_modulos = false;
            puesto.show_usuarios = false;
        };
        $scope.add_remove_checked_modulo = function (rol, modulo) {
            if (modulo.is_checked) {
                var modulos_acciones_ids = [];
                for (var i = 0; i < modulo.acciones.length; i++) {
                    if (!modulo.acciones[i].is_checked) {
                        modulos_acciones_ids.push(modulo.acciones[i].id);
                    }
                }
                create_modulos_acciones(rol, modulos_acciones_ids, modulo);
            } else {
                var modulos_acciones_roles_ids = [];
                for (var i = 0; i < modulo.acciones.length; i++) {
                    if (modulo.acciones[i].is_checked) {
                        modulos_acciones_roles_ids.push(modulo.acciones[i].modulo_accion_rol_id);
                    }
                }
                inactivate_modulos_acciones(modulos_acciones_roles_ids, modulo);
            }
        };
        $scope.add_remove_permisos = function (rol, accion) {
            if (accion.is_checked) {
                var data_send = {rol_id: rol.id, modulo_accion_id: accion.id};
                ModulosAccionesRolesService.create(data_send).then(function (data) {
                    accion.modulo_accion_rol_id = data.id;
                });
            } else {
                ModulosAccionesRolesService.inactivate(accion.modulo_accion_rol_id).then(function () {
                });
            }
        };
        function create_modulos_acciones(rol, modulos_acciones_ids, modulo) {
            var data_send = {rol_id: rol.id, modulos_acciones_ids: modulos_acciones_ids};
            ModulosAccionesRolesService.createMultiple(data_send).then(function (data_response) {
                var modulos_acciones_roles_ids = data_response.modulos_acciones_roles_ids;
                for (var i = 0; i < modulos_acciones_roles_ids.length; i++) {
                    var accion_index = get_accion_index_by_modulo_accion_id(modulo.acciones, modulos_acciones_roles_ids[i].modulo_accion_id);
                    if (accion_index !== -1) {
                        modulo.acciones[accion_index].modulo_accion_rol_id = modulos_acciones_roles_ids[i].modulo_accion_rol_id;
                        modulo.acciones[accion_index].is_checked = true;
                    }
                }
                modulo.is_checked = is_all_acciones_modulo_checked(modulo);
            }, function () {
                modulo.is_checked = is_all_acciones_modulo_checked(modulo);
            });
        }
        function inactivate_modulos_acciones(modulos_acciones_roles_ids, modulo) {
            var data_send = {modulos_acciones_roles_ids: modulos_acciones_roles_ids};
            ModulosAccionesRolesService.inactivateMultiple(data_send).then(function () {
                for (var i = 0; i < modulos_acciones_roles_ids.length; i++) {
                    var accion_index = get_accion_index_by_modulo_accion_rol_id(modulo.acciones, modulos_acciones_roles_ids[i]);
                    if (accion_index !== -1) {
                        delete modulo.acciones[accion_index]["modulo_accion_rol_id"];
                        modulo.acciones[accion_index].is_checked = false;
                    }
                }
                modulo.is_checked = is_all_acciones_modulo_checked(modulo);
            }, function () {
                modulo.is_checked = is_all_acciones_modulo_checked(modulo);
            });
        }
        function getAllPermisos() {
            PermisosService.getAllPermisos().then(function (data_response) {
                $scope.permisos = data_response.permisos;
                getAllRoles();
            });
        }
        function getAllRoles() {
            RolesService.getAllRoles().then(function (data_response) {
                $scope.roles = data_response.roles;
                for (var i = 0; i < $scope.roles.length; i++) {
                    $scope.roles[i].show_usuarios = false;
                    $scope.roles[i].show_modulos = false;
                    $scope.roles[i].grupos_modulos = angular.copy($scope.permisos);
                    for (var j = 0; j < $scope.roles[i].grupos_modulos.length; j++) {
                        for (var k = 0; k < $scope.roles[i].grupos_modulos[j].categorias.length; k++) {
                            for (var l = 0; l < $scope.roles[i].grupos_modulos[j].categorias[k].modulos.length; l++) {
                                for (var m = 0; m < $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].acciones.length; m++) {
                                    $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].acciones[m].is_checked = false;
                                    for (var n = 0; n < $scope.roles[i].acciones_permitidas.length; n++) {
                                        if ($scope.roles[i].acciones_permitidas[n].modulo_accion_id === $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].acciones[m].id) {
                                            $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].acciones[m].modulo_accion_rol_id = $scope.roles[i].acciones_permitidas[n].modulo_accion_rol_id;
                                            $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].acciones[m].is_checked = true;
                                        }
                                    }
                                }
                                $scope.roles[i].grupos_modulos[j].categorias[k].modulos[l].is_checked = is_all_acciones_modulo_checked($scope.roles[i].grupos_modulos[j].categorias[k].modulos[l]);
                            }
                        }
                    }
                }
                $scope.show_list = true;
            });
        }
        function get_accion_index_by_modulo_accion_id(acciones, modulo_accion_id) {
            for (var j = 0; j < acciones.length; j++) {
                if (acciones[j].id == modulo_accion_id) {
                    return j;
                }
            }
            return -1;
        }
        function get_accion_index_by_modulo_accion_rol_id(acciones, modulo_accion_rol_id) {
            for (var j = 0; j < acciones.length; j++) {
                if (acciones[j].modulo_accion_rol_id == modulo_accion_rol_id) {
                    return j;
                }
            }
            return -1;
        }
        function is_all_acciones_modulo_checked(modulo) {
            for (var i = 0; i < modulo.acciones.length; i++) {
                if (!modulo.acciones[i].is_checked) {
                    return false;
                }
            }
            return true;
        }
    }
]);

angular.module("app").controller('RolesAgregarCtrl', [
    '$scope',
    '$state',
    '$window',
    'RolesService',
    'validationManager',
    function ($scope, $state, $window, RolesService, validationManager) {
        $window.document.title = page_title + " :: Agregar rol";
        localStorage.setItem("app_last_state", JSON.stringify({state: $state.current.name, params: null}));
        $scope.action = 'create';
        $scope.form_rol = {rol_nombre: ""};
        $scope.submit = function () {
            var data_send = angular.copy($scope.form_rol);
            RolesService.create(data_send).then(function () {
                $state.go("main.roles_lista");
            });
        };
        $scope.openCancelDialog = function () {
            show_cancel_dialog({
                on_save: function () {
                    //intentara guardar los cambios, pasando antes por la validacion del formulario
                    if (validationManager.validateForm(angular.element(document.querySelector('form')))) {
                        $scope.submit();
                    }
                },
                on_leave: function () {
                    //continua sin guardar y sale del modulo
                    $state.go('main.roles_lista');
                }
            });
        };
    }
]);

angular.module("app").controller('RolesEditarCtrl', [
    '$scope',
    '$state',
    '$stateParams',
    '$window',
    'RolesService',
    'validationManager',
    function ($scope, $state, $stateParams, $window, RolesService, validationManager) {
        $window.document.title = page_title + " :: Editar rol";
        localStorage.setItem("app_last_state", JSON.stringify({state: $state.current.name, params: null}));
        $scope.action = 'edit';
        $scope.form_rol = {};
        RolesService.getRolById($stateParams.rol_id).then(function (data_response) {
            $scope.form_rol = angular.copy(data_response.rol);
        });
        $scope.submit = function () {
            var data_send = angular.copy($scope.form_rol);
            RolesService.update($stateParams.rol_id, data_send).then(function () {
                $state.go("main.roles_lista");
            });
        };
        $scope.openCancelDialog = function () {
            show_cancel_dialog({
                on_save: function () {
                    //intentara guardar los cambios, pasando antes por la validacion del formulario
                    if (validationManager.validateForm(angular.element(document.querySelector('form')))) {
                        $scope.submit();
                    }
                },
                on_leave: function () {
                    //continua sin guardar y sale del modulo
                    $state.go('main.roles_lista');
                }
            });
        };
    }
]);