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

class Usuarios extends MY_Controller {

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

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

        $data['titulo'] = 'Usuarios';
        $data['usuarios'] = $this->Usuario_model->listar();
        $this->layout('seguridad/usuarios/index', $data);
    }

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

        $data['titulo'] = 'Nuevo Usuario';
        $data['roles'] = $this->Rol_model->listar();
        $this->layout('seguridad/usuarios/create', $data);
    }

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

        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim');
        $this->form_validation->set_rules('usuario', 'Usuario', 'required|trim');
        $this->form_validation->set_rules('clave', 'Contraseña', 'required|trim');
        $this->form_validation->set_rules('rol_id', 'Rol', 'required');

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

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

        if ($this->Usuario_model->existe_usuario($usuario)) {
            $this->session->set_flashdata('error', 'El nombre de usuario ya existe');
            redirect('seguridad/usuarios/create');
        }

        $data = array(
            'nombre'  => $this->input->post('nombre', TRUE),
            'usuario' => $usuario,
            'clave'   => password_hash($this->input->post('clave'), PASSWORD_DEFAULT),
            'email'   => $this->input->post('email', TRUE),
            'rol_id'  => $this->input->post('rol_id', TRUE),
            'estado'  => 1
        );

        if ($this->Usuario_model->insertar($data)) {
            $this->session->set_flashdata('success', 'Usuario registrado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar el usuario');
        }

        redirect('seguridad/usuarios');
    }

    public function edit($id) {
        $this->validar_permiso('usuarios_editar');

        $usuario = $this->Usuario_model->obtener($id);

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

        $data['titulo'] = 'Editar Usuario';
        $data['usuario'] = $usuario;
        $data['roles'] = $this->Rol_model->listar();

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

    public function update($id) {
        $this->validar_permiso('usuarios_editar');

        $usuarioActual = $this->Usuario_model->obtener($id);

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

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

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

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

        if ($this->Usuario_model->existe_usuario($usuario, $id)) {
            $this->session->set_flashdata('error', 'El nombre de usuario ya existe');
            redirect('seguridad/usuarios/edit/'.$id);
        }

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

        $clave = $this->input->post('clave');
        if (!empty($clave)) {
            $data['clave'] = password_hash($clave, PASSWORD_DEFAULT);
        }

        if ($this->Usuario_model->actualizar($id, $data)) {
            $this->session->set_flashdata('success', 'Usuario actualizado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo actualizar el usuario');
        }

        redirect('seguridad/usuarios');
    }

    public function estado($id) {
        $this->validar_permiso('usuarios_eliminar');

        $usuario = $this->Usuario_model->obtener($id);

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

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

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

        redirect('seguridad/usuarios');
    }
}