<?php

/**
 * Descripción del Controlador UsuariosApi
 *
 * usuario
 *
 * Licenciado bajo la Licencia Apache, Versión 2.0;
 * Usted no puede usar este archivo excepto en conformidad con la Licencia.
 * Usted puede obtener una copia de la Licencia en:
 *      http://www.php.net/license/3_01.txt. 
 * A menos que sea requerido por la ley aplicable o acordado por escrito, el software
 * Distribuido bajo la licencia se distribuye en una "AS IS" o  "COMO ESTA" BASE,
 * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, expresas o implícitas.
 * Consulte la Licencia para los permisos y Limitaciones bajo la Licencia.
 *
 * @package    Usuarios\Controladores
 * @author     LUIS ANTONIO MONTOYA CONTRERAS <lmontoya@ccsm.org.co>
 * @author     SICAM 20171025 <sicam32@ccsm.org.co>
 * @copyright  2017 Cámara de Comercio de Santa Marta para el Magdalena
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
 * @version    201712181018
 * @link       http://sicam.ccsm.org.co/docs/usuarios/UsuariosApi
 */
 
class UsuariosApiControlador extends Controladores { 
    /**
     * Vista que se encarga de mostrar todos los detalles/datos asociados a 
     * los registros de Usuarios.
     * @return HTML Datos e información de Usuarios.
     */
    function verDetalles() {
        $usuario = UsuariosApi::datos($this->usuarioID);
        Vistas::mostrar('usuarios', 'usuariosapi/ver-detalles', array('usuario' => $usuario));
    }
    
    /**
     * Vista que se encarga de organizar la forma de presentar 
     * los registros de Usuarios al usuario.
     * @return HTML Listado de Usuarios.
     */
    function mostrarActivos() {
        Vistas::mostrar('usuarios', 'usuariosapi/lst-todos');
    }
     /**
     * Permite mostrar en forma de tabla los registros de UsuariosApi.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListadoActivos() {
        $usuarios = UsuariosApi::todos(UsuariosApi::ACTIVO);
        var_dump($usuarios);
        Vistas::mostrar('usuarios', 'usuariosapi/tbl-todos-activos', 
            array( 'usuarios' => $usuarios)
        );
    }
    /**
     * Vista que se encarga de organizar la forma de presentar 
     * los registros de Usuarios al usuario.
     * @return HTML Listado de Usuarios.
     */
    function mostrarTodos() {
        Vistas::mostrar('usuarios', 'usuariosapi/lst-todos');
    }
    /**
     * Permite mostrar en forma de tabla los registros de UsuariosApi.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListado() {
        $usuarios = UsuariosApi::todos();
        Vistas::mostrar('usuarios', 'usuariosapi/tbl-todos', 
            array( 'usuarios' => $usuarios)
        );
    }
    /**
     * Responde con el formulario de UsuariosApi vacio, solo datos necesarios.
     * LLama a la función que devuleve el formulario pero 
     * sin enviarle los datos de UsuariosApi.  
     * Esta función se crea para poder gestionar el permiso de NUEVO UsuariosApi
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function mostrarFormularioNuevo() {
        $this->mostrarFormulario();
    }
    /**
     * Función que toma los datos enviados y crea un nuevo registro
     * @return RespuestasSistema 
     */
    private function guardarNuevo() {
        $creadoID = UsuariosApi::guardar($this->aplicaconID, $this->usuarioNOMBRE, $this->usuarioCLAVE, $this->usuariosESTADO, $this->usuarioADMINISTRADOR);
        if ($creadoID) {
            UsuariosApi::guardarApi($creadoID, $this->apiCLAVESECRETA, $this->apiIP);
            $operaciones = isset($this->operacionID) ? $this->operacionID : array();
            $roles = isset( $this->rolID) ?  $this->rolID : array();
            if($this->asignarPermiso($creadoID,  $operaciones )){
                if($this->asignarRoles($creadoID,  $roles)){
                    return RespuestasSistema::exito("", UsuariosApi::datos($creadoID));    
                }else{
                    return RespuestasSistema::fallo("Se creo el usuario pero hubo error al momento de asignar permiso, contacte con el Centro TICS.");
                }
            }else{
                return RespuestasSistema::fallo("Se creo el usuario pero hubo error al momento de asignar permiso, contacte con el Centro TICS.");
            }
        } else {
            return RespuestasSistema::fallo("No se pudo CREAR el nuevo UsuariosApi. Si vuelve a suceder, contacte con el Centro TICS.");
        }
    }
    
    private function asignarPermiso($usuarioID, $operaciones){
        $operacionTotal = 0;
        if(!empty($operaciones)){
            foreach($operaciones as $operacion):
                $permiso = Usuarios::asignarPermiso($operacion, $usuarioID);
                if(!empty($permiso) and $permiso){
                    $operacionTotal++;
                }
            endforeach;   
            if($operacionTotal!=count($operaciones)){
                return false;
            }
        }
        return true;
    }
    
    private function asignarRoles($usuarioID, $roles){
        $operacionTotal = 0;
        if(!empty($roles)){
            foreach($roles as $rol):
                $permiso = Usuarios::asignarRol($rol, $usuarioID);
                if(!empty($permiso) and $permiso){
                    $operacionTotal++;
                }
            endforeach;   
            if($operacionTotal!=count($roles)){
                return false;
            }
        }
        return true;
    }
    
    /**
     * Recibe el ID del UsuariosApi y obtiene sus datos para ser enviados 
     * al formulario, y asi cargar los datos en los inputs.
     * Esta función se crea para poder gestionar el permiso de EDITAR UsuariosApi
     * @return HTML Formulario con los datos del UsuariosApi a editar.
     */
    function mostrarFormularioEditar() {
        $usuarios = UsuariosApi::datos($this->usuarioID);
        $this->mostrarFormulario($usuarios);
    }
    /**
     * Función que toma los datos enviados y actualiza el registro
     * @return RespuestasSistema 
     */
    private function guardarCambios() {
        $UsuariosApi = UsuariosApi::datosCompletos($this->usuarioID);
        $actualizado = UsuariosApi::actualizar(
                $this->usuarioID, $this->aplicaconID, 
                $this->usuarioNOMBRE, $this->usuarioADMINISTRADOR
        );
        if (!is_null($actualizado)) {
            if($this->usuarioCLAVE != $UsuariosApi->usuarioCLAVE):
                Usuarios::actualizarClave($this->usuarioCLAVE,$this->usuarioID);
            endif;
            if($this->usuariosESTADO == 'ACTIVO' and $UsuariosApi->usuarioESTADO != 'ACTIVO' ):
                Usuarios::activar($this->usuarioID);
            endif;
            if($this->usuariosESTADO == 'DESACTIVO' and $UsuariosApi->usuarioESTADO != 'DESACTIVO' ):
                Usuarios::desactivar($this->usuarioID);
            endif;
            $roles = isset( $this->rolID) ?  $this->rolID : array();
            $operaciones = isset($this->operacionID) ? $this->operacionID : array();
            $this->asignarPermiso($this->usuarioID,  $operaciones );
            $this->asignarRoles($this->usuarioID,  $roles );
            
            if(!empty($this->operacionesID)):
                $this->eliminarPermiso($UsuariosApi, $this->operacionesID);
            else:
                $this->eliminarPermiso($UsuariosApi);
            endif;
            
            if(!empty($this->rolesID)):
                $this->eliminarRol($UsuariosApi, $this->rolesID);
            else:
                $this->eliminarRol($UsuariosApi);
            endif;
            
            return RespuestasSistema::exito("", UsuariosApi::datos($this->usuarioID));
        } else {
            return RespuestasSistema::fallo("No se actualizó el UsuariosApi. Verifique los datos, o contacte al Centro TICS.");
        }
    }
    
    private function eliminarPermiso($UsuariosApi, $operaciones = array()){
        if(isset($UsuariosApi->permisos) and !empty($UsuariosApi->permisos)){
            foreach($UsuariosApi->permisos as $permiso):
                if(!in_array($permiso->operacionID, $operaciones)):
                    Usuarios::eliminarPermiso($permiso->operacionID, $UsuariosApi->usuarioID);
                endif;
            endforeach;    
        }
    }
    
    private function eliminarRol($UsuariosApi, $roles = array()){
        if(isset($UsuariosApi->roles) and !empty($UsuariosApi->roles)){
            foreach($UsuariosApi->roles as $rol):
                if(!in_array($rol->rolID, $roles)):
                    Usuarios::eliminarRol($rol->rolID, $UsuariosApi->usuarioID);
                endif;
            endforeach;    
        }
    }
    /**
     * Muestra el Formulario procesado para ser mostrado al usuario.
     * Se le envian unos datos inciales para la carga de la vista, y
     * se envia los datos del UsuariosApi cuando se esta editando.
     * @return HTML Vista del Formulario de UsuariosApi
     */
    private function mostrarFormulario($UsuariosApi = null) {
        Vistas::mostrar('usuarios', 'usuariosapi/form-UsuariosApi', array(
          'Aplicaciones' => Aplicaciones::todas(),
          'Operaciones'  => ControlOperaciones::todos(),
          'Roles'   => Roles::todos(),
          'UsuariosApi' => $UsuariosApi
        ));
    }
    /**
     * Guardar Datos Recibidos, bien sea como un registro nuevo, o como una actualización.
     * Despues imprime las Respuesta del Sistema a la ejecución de la operacion
     */
    function guardarDatos() {
        if (empty($this->usuarioID)) {
            echo $this->guardarNuevo();
        } else {
            echo $this->guardarCambios();
        }
    }
    
}
// Generado el 2017-12-18 10:18:50:000000

