<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Roles extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('seguridad/Rol_model');
        $this->load->model('seguridad/Permiso_model');
    }

    public function index() {
        $this->validar_permiso('roles_ver');

        $data['titulo'] = 'Roles';
        $data['roles'] = $this->Rol_model->listar();
        $this->layout('seguridad/roles/index', $data);
    }

    public function create() {
        $this->validar_permiso('roles_crear');

        $data['titulo'] = 'Nuevo Rol';
        $data['permisos'] = $this->Permiso_model->listarActivos();
        $this->layout('seguridad/roles/create', $data);
    }

    public function store() {
        $this->validar_permiso('roles_crear');

        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim');

        if ($this->form_validation->run() == FALSE) {
            $this->create();
            return;
        }

        $nombre = $this->input->post('nombre', TRUE);

        if ($this->Rol_model->existe_nombre($nombre)) {
            $this->session->set_flashdata('error', 'El nombre del rol ya existe');
            redirect('seguridad/roles/create');
        }

        $data = array(
            'nombre' => $nombre,
            'descripcion' => $this->input->post('descripcion', TRUE),
            'estado' => 1
        );

        $rol_id = $this->Rol_model->insertar($data);

        if ($rol_id) {
            $permisos = $this->input->post('permisos');
            $this->Rol_model->guardarPermisos($rol_id, $permisos ? $permisos : array());
            $this->session->set_flashdata('success', 'Rol registrado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar el rol');
        }
        
        redirect('seguridad/roles');
    }

    public function edit($id) {
        $this->validar_permiso('roles_editar');
        $rol = $this->Rol_model->obtener($id);

        if (!$rol) {
            show_404();
        }

        $data['titulo'] = 'Editar Rol';
        $data['rol'] = $rol;
        $data['permisos'] = $this->Permiso_model->listarActivos();
        $data['permisosRol'] = $this->Rol_model->getPermisosRol($id);

        $this->layout('seguridad/roles/edit', $data);
    }

    public function update($id) {
        $this->validar_permiso('roles_editar');
        $rol = $this->Rol_model->obtener($id);

        if (!$rol) {
            show_404();
        }

        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim');

        if ($this->form_validation->run() == FALSE) {
            $this->edit($id);
            return;
        }

        $nombre = $this->input->post('nombre', TRUE);

        if ($this->Rol_model->existe_nombre($nombre, $id)) {
            $this->session->set_flashdata('error', 'El nombre del rol ya existe');
            redirect('seguridad/roles/edit/'.$id);
        }

        $data = array(
            'nombre' => $nombre,
            'descripcion' => $this->input->post('descripcion', TRUE)
        );

        if ($this->Rol_model->actualizar($id, $data)) {
            $permisos = $this->input->post('permisos');
            $this->Rol_model->guardarPermisos($id, $permisos ? $permisos : array());

            $this->session->set_flashdata('success', 'Rol actualizado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo actualizar el rol');
        }

        redirect('seguridad/roles');
    }

    public function estado($id) {
        $rol = $this->Rol_model->obtener($id);

        if (!$rol) {
            show_404();
        }

        $nuevoEstado = ($rol->estado == 1) ? 0 : 1;

        if ($this->Rol_model->cambiarEstado($id, $nuevoEstado)) {
            $mensaje = ($nuevoEstado == 1) ? 'Rol activado correctamente' : 'Rol desactivado correctamente';
            $this->session->set_flashdata('success', $mensaje);
        } else {
            $this->session->set_flashdata('error', 'No se pudo cambiar el estado del rol');
        }

        redirect('seguridad/roles');
    }
}