<?php

defined('BASEPATH') OR exit('No direct script access allowed');
require APPPATH . 'libraries/RestController.php';

use chriskacerguis\RestServer\RestController;

require APPPATH . 'libraries/Format.php';

/**
 * Description of Usuarios
 *
 * @author cvillegas
 */
class Usuarios extends RestController {

    function __construct() {
        parent::__construct();
        $this->load->helper('session');
        $this->load->model("usuarios_model");
    }

    public function get_all_usuarios_get() {
        $this->_params_validation_page_order_and_filters();
        $limit_offset_order_and_filters = $this->_get_limit_offset_order_and_filters();
        $data['total_usuarios'] = $this->usuarios_model->count_all_usuarios($limit_offset_order_and_filters);
        if ($data['total_usuarios'] > 0) {
            $usuarios = $this->usuarios_model->get_all_usuarios($limit_offset_order_and_filters);
            $data['usuarios'] = $usuarios;
        } else {
            $data['usuarios'] = [];
        }
        $this->response($data, RestController::HTTP_OK);
    }

    public function get_all_usuarios_activos_get() {
        $usuarios = $this->usuarios_model->get_all_usuarios_activos();
        $data['usuarios'] = $usuarios;
        $this->response($data, RestController::HTTP_OK);
    }

    public function get_usuario_by_id_get() {
        $this->_params_validation_id();
        $usuario = $this->usuarios_model->get_usuario_by_id($this->get('id'));
        if ($usuario !== NULL) {
            $this->load->model('empleados_model');
            $this->response(["usuario" => $usuario], RestController::HTTP_OK);
        } else {
            $this->response(['message' => "Error al obtener el usuario, contacte a soporte técnico."], RestController::HTTP_NOT_FOUND);
        }
    }

    public function create_post() {
        $this->_form_validation_create();
        $this->db->trans_start();
        $data_insert = $this->_fill_data_insert();
        $id = $this->usuarios_model->insert($data_insert);
        if ($id) {
            $email = $data_insert['email'];
            $this->load->helper('email');
            $key = $this->config->item('encrypt_url_key'); //key to encrypt and decrypts.
            $id_compressed = encrypt_url($id . '|' . $email . '|' . $data_insert['email_code'], $key);
            if ($this->_envio_correo_registro($email, $id_compressed, $data_insert['username'])) {
                $this->db->trans_complete();
                $this->response(['message' => 'Usuario creado, se envió un correo al usuario para que pueda acceder a la plataforma.'], RestController::HTTP_OK);
            } else {
                $this->response(['message' => 'Error: No se envió el correo.'], RestController::HTTP_INTERNAL_ERROR);
            }
        } else {
            $this->response(['message' => 'Error no se pudieron actualizar los cambios'], RestController::HTTP_INTERNAL_ERROR);
        }
    }

    public function update_post() {
        $this->_params_validation_id();
        $this->_form_validation_update();
        if ($this->usuarios_model->update($this->get('id'), $this->_fill_data_update())) {
            $this->response(["message" => "Usuario guardado"], RestController::HTTP_OK);
        } else {
            $this->response(['message' => 'Error no se pudieron actualizar los cambios'], RestController::HTTP_INTERNAL_ERROR);
        }
    }

    public function inactivate_post() {
        $this->_params_validation_id();
        if ($this->usuarios_model->update($this->get('id'), $this->_fill_data_inactivate())) {
            $this->response(["message" => "Usuario Inactivado"], RestController::HTTP_OK);
        } else {
            $this->response(['message' => 'Error no se pudieron actualizar los cambios'], RestController::HTTP_INTERNAL_ERROR);
        }
    }

    public function reactivate_post() {
        $this->_params_validation_id();
        if ($this->usuarios_model->update($this->get('id'), $this->_fill_data_reactivate())) {
            $this->response(["message" => "Usuario Activado"], RestController::HTTP_OK);
        } else {
            $this->response(['message' => 'Error no se pudieron actualizar los cambios'], RestController::HTTP_INTERNAL_ERROR);
        }
    }

    private function _envio_correo_registro($destinatario, $id_url, $username) {
        $this->load->helper('email');
        $data['page_title'] = $this->config->item('page_title');
        $subject = 'Acceso para el sistema de ' . $data['page_title'] . '.';
        $data['base_url'] = $this->config->item('base_url');
        $data['url'] = $this->config->item('base_url') . '#!/confirmar-acceso?codigo=' . $id_url;
        $data['username'] = $username;
        $message = $this->load->view('mail/nuevo-registro-usuario', $data, TRUE);
        return send_mail($destinatario, $subject, $message);
    }

    private function _fill_data_insert() {
        $data = array();
        $data['username'] = $this->post('username');
        $data['empleado_id'] = $this->post('empleado_id');
        $data['rol_id'] = $this->post('rol_id');
        $data['email'] = $this->post('email');
        $data['email_code'] = date_timestamp_get(date_create());
        $data['status'] = 1;
        $data['created_at'] = date("Y-m-d H:i:s");
        return $data;
    }

    private function _fill_data_update() {
        $data = array();
        $data['username'] = $this->post('username');
        $data['empleado_id'] = $this->post('empleado_id');
        $data['rol_id'] = $this->post('rol_id');
        $data['email'] = $this->post('email');
        $data['updated_at'] = date("Y-m-d H:i:s");
        return $data;
    }

    private function _fill_data_inactivate() {
        $data['updated_at'] = date('Y-m-d H:i:s');
        $data['status'] = -1;
        return $data;
    }

    private function _fill_data_reactivate() {
        $data['updated_at'] = date('Y-m-d H:i:s');
        $data['status'] = 1;
        return $data;
    }

    public function is_unique_usuario_empleado_create() {
        $empleado_id = $this->post('empleado_id');
        $usuario = $this->usuarios_model->check_usuario_empleado_is_unique_in_sistema_create($empleado_id);
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_usuario_empleado_create', 'Ya existe un usuario ' . $status . ' con el empleado elegido.');
            return FALSE;
        }
        return TRUE;
    }

    public function is_unique_usuario_empleado_update() {
        $empleado_id = $this->post('empleado_id');
        $usuario = $this->usuarios_model->check_usuario_empleado_is_unique_in_sistema_update($empleado_id);
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_usuario_empleado_update', 'Ya existe un usuario ' . $status . ' con el empleado elegido.');
            return FALSE;
        }
        return TRUE;
    }

    public function is_unique_usuario_email_create() {
        $email = $this->post('email');
        $usuario = $this->usuarios_model->check_email_is_unique_in_sistema_create($email);
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_usuario_email_create', 'Ya existe un usuario ' . $status . ' con ese correo.');
            return FALSE;
        }
        return TRUE;
    }

    public function is_unique_usuario_email_update() {
        $username = $this->post('username');
        $usuario = $this->usuarios_model->check_email_is_unique_in_sistema_update($username, $this->get('id'));
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_usuario_email_update', 'Ya existe un usuario ' . $status . ' con ese correo.');
            return FALSE;
        }
        return TRUE;
    }

    public function is_unique_username_create() {
        $username = $this->post('username');
        $usuario = $this->usuarios_model->check_username_is_unique_in_sistema_create($username);
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_username_create', 'Ya existe un usuario ' . $status . ' con ese nombre de usuario');
            return FALSE;
        }
        return TRUE;
    }

    public function is_unique_username_update() {
        $username = $this->post('username');
        $usuario = $this->usuarios_model->check_username_is_unique_in_sistema_update($username, $this->get('id'));
        if ($usuario !== NULL) {
            $status = ($usuario['status'] === "1") ? "<strong>ACTIVO</strong>" : "<strong>INACTIVO</strong>";
            $this->form_validation->set_message('is_unique_username_update', 'Ya existe un usuario ' . $status . ' con ese nombre de usuario');
            return FALSE;
        }
        return TRUE;
    }

    private function _form_validation_create() {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('username', 'Nombre de Usuario', 'trim|required|max_length[100]|callback_is_unique_username_create');
        $this->form_validation->set_rules('empleado_id', 'Empleado', 'trim|required|is_natural_no_zero|callback_is_unique_usuario_empleado_create');
        $this->form_validation->set_rules('rol_id', 'Rol', 'trim|required|is_natural_no_zero');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
        if (!$this->form_validation->run()) {
            $this->response(array('message' => validation_errors()), RestController::HTTP_BAD_REQUEST);
        }
    }

    private function _form_validation_update() {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('username', 'Nombre de Usuario', 'trim|required|max_length[100]|callback_is_unique_username_update');
        $this->form_validation->set_rules('rol_id', 'Rol', 'trim|required|is_natural_no_zero');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
        if (!$this->form_validation->run()) {
            $this->response(array('message' => validation_errors()), RestController::HTTP_BAD_REQUEST);
        }
    }

    private function _get_limit_offset_order_and_filters() {
        $default_order = array(
        );
        $this->load->helper('pagination_order_filters');
        return get_limit_offset_order_and_filters($default_order);
    }

    /**
     * Reglas para validar los parametros de paginacion y ordenamiento
     * 
     * @access protected
     * @errorResponse Code: 401 HTTP_BAD_REQUEST Content: {message:[string]}
     */
    private function _params_validation_page_order_and_filters() {
        $this->load->library('params_validation');
        $this->params_validation->set_rules('pagina', 'Paginaci&oacute;n', 'trim|is_natural_no_zero');
        $this->params_validation->set_rules('by_page', 'Cantidad de elementos por p&aacute;gina', 'trim|is_natural_no_zero');
        $this->params_validation->set_rules('ordenamiento', 'Ordenamiento', 'trim|check_order_exists');
        $this->params_validation->set_rules('buscar', 'Filtros', 'trim|check_filter_exists');
        if (!$this->params_validation->run()) {
            $this->response(['message' => params_validation_errors()], RestController::HTTP_BAD_REQUEST);
        }
    }

    private function _params_validation_id() {
        $this->load->library('params_validation');
        $this->params_validation->set_rules('id', 'ID', 'trim|required|is_natural_no_zero');
        if (!$this->params_validation->run()) {
            $this->response(array('message' => params_validation_errors()), RestController::HTTP_BAD_REQUEST);
        }
    }
}
