<?php
require_once('../clases/DataManager.Class.php');

class Usuario {
    
    public $conn;

    function __construct($c) {
        
        
    }

	/*******************************************************************************
	* Método que verifica la clave de un usuario
	* Parámetros de entrada: RUT del usuario
	* Parámetros de salida: 0 no válido, 1 válido
	*******************************************************************************/
	public function verificaClave($username, $clave) {
		
			$stmt = $this->conn->prepare("CALL SP_usuario_verifica_clave(?, ?)");
			$stmt->execute(array($username, $clave));
			$resultado = $stmt->fetch();
			
			return $resultado;
			
	}
	
	/**
 	 * Método que permite mostrar un listado de usuarios de acuerdo a su perfil o nombre de usuario
	 * Parámetros de entrada: ID (null, 1), Tipo retorno (0=> una fila, 1=> todos los registros)
	 * Parámetros de salida: todos los datos de la tabla Usuarios y la tabla Perfil
 	 */
	public function muestraInformacionUsuario($idUsuario, $idRol, $tipo_retorno)
	{
		$stmt = $this->conn->prepare("CALL SP_usuario_entrega_informacion(?, ?)");
		$stmt->execute(array($idUsuario, $idRol));
		
		if($tipo_retorno == 0) {
			
			// echo "Retorna solamente la fila específica";
			return $stmt->fetch();
			
		} else {
			
			// echo "Retorna todas las tuplas de acuerdo a los parámetros de entrada";
			return $stmt->fetchAll();		
			
		}
		
	}	
	
	/*******************************************************************************
	* Método que permite modificar la clave de acceso de un Usuario
	* Parámetros de entrada: Username, nueva clave, (si/no) pedir cambio de clave en el próximo ingreso
	* Parámetros de salida: Cantidad de filas afectadas
	*******************************************************************************/
	public function modificaClave($username, $clave, $acceso) {
		
			$stmt = $this->conn->prepare("CALL SP_usuario_modifica_clave(?, ?, ?)");
			$stmt->execute(array($username, $clave, $acceso));
			return $stmt->fetch();
			
	}

	/**
 	 * Método que recupera los perfiles disponibles
	 * Parámetros de entrada: Id rol, Estado del rol, Tipo retorno (0=> una fila, 1=> todos los registros)
	 * Parámetros de salida: todos los datos de la tabla de perfiles
 	 */
	public function muestraRol($rolID, $rol_estado, $tipo_retorno)
	{
		$stmt = $this->conn->prepare("CALL SP_rol_informacion(?, ?)");
		$stmt->execute(array($rolID, $rol_estado));
		
		if($tipo_retorno == 0) {
			
			// echo "Retorna solamente la fila específica";
			return $stmt->fetch();
			
		} else {
			
			// echo "Retorna todas las tuplas de acuerdo a los parámetros de entrada";
			return $stmt->fetchAll();		
			
		}		
		
	}
	
		/**
 	 * Método que recupera los funcionarios activos
	 * Parámetros de entrada: Id funcionario, Estado del funcionario, Tipo retorno (0=> una fila, 1=> todos los registros)
	 * Parámetros de salida: todos los datos de la tabla de funcionarios
 	 */
	public function muestraFuncionario($fncID,$fncCargo, $fnc_estado, $tipo_retorno)
	{
		$stmt = $this->conn->prepare("CALL SP_funcionario_entrega_informacion(?, ?, ?)");
		$stmt->execute(array($fncID, $fncCargo, $fnc_estado));
		
		if($tipo_retorno == 0) {
			
			// echo "Retorna solamente la fila específica";
			return $stmt->fetch();
			
		} else {
			
			// echo "Retorna todas las tuplas de acuerdo a los parámetros de entrada";
			return $stmt->fetchAll();		
			
		}		
		
	}
		/**
 	 * Método que recupera los funcionarios activos
	 * Parámetros de entrada: Id funcionario, Estado del funcionario, Tipo retorno (0=> una fila, 1=> todos los registros)
	 * Parámetros de salida: todos los datos de la tabla de funcionarios
 	 */
	public function muestraFuncionarioSinUsuario($fncCargo, $fnc_estado, $tipo_retorno)
	{
		$stmt = $this->conn->prepare("CALL SP_funcionario_sin_usuario_entrega_informacion(?, ?)");
		$stmt->execute(array($fncCargo, $fnc_estado));
		
		if($tipo_retorno == 0) {
			
			// echo "Retorna solamente la fila específica";
			return $stmt->fetch();
			
		} else {
			
			// echo "Retorna todas las tuplas de acuerdo a los parámetros de entrada";
			return $stmt->fetchAll();		
			
		}		
		
	}
	/**
 	 * Método que ingresa una nueva cuenta de usuario
	 * Parámetros de entrada: Datos generales del usuario + código de verificación de contraseña
	 * Parámetros de salida: todos los datos del nuevo usuario
 	 */
	public function ingresarUsuario($fncUID, $rolUID,  $contrasena, $codVerificacion) 
	{

		$sql = "CALL SP_usuario_ingresa(?, ?, ?, ?)";
            	$stmt = $this->conn->prepare($sql);
		$stmt->execute(array($fncUID,
					$rolUID,					
					$contrasena,
					$codVerificacion));

            	return $stmt->fetch();	
    }
	
	/****************************************************************************************************
    * Método que modifica la información de un usuario
    * Parámetros de entrada: Id del usuario, Id del perfil, bloqueado (Si/No), estado (Activo/Inactivo)
    * Parámetros de salida: Cantidad de filas afectadas
    ****************************************************************************************************/

    public function modificarUsuario(
						$usrUID, 
						$rolUID, $estado) {
		
            $stmt = $this->conn->prepare("CALL SP_usuario_modifica(?, ?, ?)");
            $stmt->execute(array(
						$usrUID, 
						$rolUID, $estado));
            return $stmt->fetch();
			
    }

	/**
 	 * Método que elimina un Usuario
	 * Parámetros de entrada: UserID
	 * Parámetros de salida: n° filas afectadas
 	 */
	public function eliminarUsuario($p_id){
	
		$stmt = $this->conn->prepare("CALL SP_usuario_elimina(?)");
		$stmt->execute(array($p_id));
		return $stmt->fetch();
	}
	
	/*******************************************************************************
	* Método que permite modificar el estado de un Usuario, asignándole también
	*   una nueva clave de acceso
	* Parámetros de entrada: RUT del usuario
	* Parámetros de salida: Token para activar la cuenta
	*******************************************************************************/
	public function modificaClaveEstado($rut, $clave, $estado) {
		
			$stmt = $this->conn->prepare("CALL SP_Usuario_Modifica_ClaveEstado(?, ?, ?)");
			$stmt->execute(array($rut, $clave, $estado));
			return $stmt->fetch();
			
	}
	
	private function encode_password($password)
	{
		$salt = 'hl09523K0H@NA+PHP_7hE-SW!FtFZl8pdwwa84';
		$_pass = str_split($password);
		foreach ($_pass as $_hashpass)
		{
			$salt .= md5($_hashpass);
		}
		return md5($salt);
	}

	function Begin() {
    	$this->conn->beginTransaction();
    }
	
	function Commit() {
    	$this->conn->commit();
    }
	
	function Rollback() {
    	$this->conn->rollback();
    }
	
	function Identity() {
    	$stmt = $this->conn->prepare("SELECT LAST_INSERT_ID() AS ID");
		$stmt->execute();
		if($row = $stmt->fetch()) {
			$ret = $row['ID'];
		}
		return($ret);
    }
	 
    function Close() {
        
        $this->conn = null;
        
    }
}
?>