<?php session_start(); 
//Obtengo la ruta General de los archivos!
error_reporting(0);
$uri ='Classes/core_class/consultasDb.php';
include_once($uri);

$uri2 ='../../Classes/core_class/consultasDb.php';
include_once($uri2);

class operador_monitor extends consultasDb
{
	private $usuarioID;
	private $habilitado;
	private $nombreUsuario;
	private $nombreApellido;
	private $contrasena;
	private $fechaAlta;
	
	private $token;
	private $error;
	private $datos_operador;
	

	public function __construct()
	{
		parent::__construct("operadores_monitor");
    	$this->setDbLink(parent::Conectar());
	}

	//Setters

	public function setHabilitado($habilitado)
	{
		$this->habilitado = $habilitado;
	}
	public function setNombreUsuario($nombreUsuario)
	{
		$this->nombreUsuario = $nombreUsuario;
	}
	public function setNombreApellido($nombreApellido)
	{
		$this->nombreApellido = $nombreApellido;
	}

	public function setContrasena($contrasena)
	{
		$this->contrasena = $contrasena;
	}
	public function setFechaAlta($fechaAlta)
	{
		$this->fechaAlta = $fechaAlta;
	}
	public function setToken($token)
	{
		$this->token = $token;
	}

	//Getters

	public function getHabilitado()
	{
		return $this->habilitado;
	}
	public function getNombreUsuario()
	{
		return $this->nombreUsuario;
	}
	public function getNombreApellido()
	{
		return $this->nombreApellido;
	}
	public function getContrasena()
	{
		return $this->contrasena;
	}
	public function getFechaAlta()
	{
		return $this->fechaAlta;
	}
	public function getToken()
	{
		return $this->token;
	}
	public function array_atrib()
	{
		return array("habilitado"=>$this->getHabilitado(),"nombreUsuario"=>$this->getNombreUsuario(),"nombreApellido"=>$this->getNombreApellido(),"correo"=>$this->getCorreo(),"contrasena"=>$this->getContrasena());
	}

	public function nuevo($parametros)
	{
		try{
			$nuevo = new consultasDb("");
			$sql = "CALL insert_operadores_monitor(".$parametros['estado'].",'".implode(",",json_decode($parametros['sucursales']))."','".$parametros['nombre_usuario']."','".$parametros['nombre_apellido']."','".md5($parametros['password'])."',".$parametros['rol'].")";
			$nuevo->setConsulta($sql);
			$q = $nuevo->query();
			$nuevo->Desconectar();
			if($q)
				$_SESSION['exito'] = "Operador del monitor agregado correctamente.";

			return $q;
		} catch (Exception $e) {
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}
	}

	public function editar($parametros)
	{
		try{
			$password = ($parametros['password']!="null")?"'".md5($parametros['password'])."'":"null";
			
			$editar = new consultasDb("");
			$sql = "CALL update_operadores_monitor(".$parametros['operador_monitor_id'].",".$parametros['estado'].",'".implode(",",json_decode($parametros['sucursales']))."','".$parametros['nombre_usuario']."','".$parametros['nombre_apellido']."',".$password.",".$parametros['rol'].")";
			$editar->setConsulta($sql);
			$q = $editar->query();
			if($q)
				$_SESSION['exito'] = "El operador del monitor editado correctamente.";
			$editar->Desconectar();
			
			return $q;
		} catch (Exception $e) {
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}

	}
	
	public function editarPerfil($parametros)
	{
		try{
			$password = ($parametros['Password']!="null")?"'".md5($parametros['Password'])."'":"null";
			
			$editar = new consultasDb("");
			$sql = "CALL update_operadores_monitor_perfil(".$parametros['OperadorMonitorID'].",'".$parametros['NombreUsuario']."','".$parametros['NombreApellido']."',".$password.")";
			$editar->setConsulta($sql);
			$q = $editar->query();
			if($q)
				$_SESSION['exito'] = "Se ha actualizado correctamente los datos de su perfil.";
			$editar->Desconectar();
			
			return $q;
		} catch (Exception $e) {
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}

	}

	public function eliminar($parametros)
	{
		try
		{
			$eliminar = new consultasDb("");
			$eliminar->setConsulta('CALL delete_operadores_monitor('.$parametros["id"].');');
			$q = $eliminar->query();
			$eliminar->Desconectar();
			if($q)
				$_SESSION['exito'] = "El operador del monitor eliminado correctamente.";
			return $q;
		} catch (Exception $e) {
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}
	}
	
	public function verificarDisponibilidad($CampoValor)
	{
		$verificarUsuario = new consultasDb("login_operador_sesion");
		$verificarUsuario->select();
		$verificarUsuario->where($CampoValor);
		$q = $verificarUsuario->numdatos_operador();
		return $q;
	}
	
	public function cantidadOperadores()
	{
		$cantidad_operadores = new consultasDb("");
		$cantidad_operadores->setConsulta("SELECT * From operadores_monitor WHERE nombreUsuario <> 'qqqq'");
		$q = $cantidad_operadores->numRow();
		return $q;
	}
	
	public function verificarPasswordActual($parametros)
	{
		$verificarUsuario = new consultasDb("");
		$verificarUsuario->setConsulta("SELECT * FROM operadores_monitor 
										WHERE Contrasena = '".md5($parametros['password'])."' 
											AND OperadorMonitorID = ".$parametros['operador_monitor_id']);
		$q = $verificarUsuario->numRow();
		return $q;
	}
	
	public function verificarNombreUsuario($parametros)
	{
		$verificarNombreUsuario = new consultasDb("");
		$verificarNombreUsuario->setConsulta("SELECT * FROM operadores_monitor WHERE NombreUsuario = '".$parametros["NombreUsuario"]."'");
		$q = $verificarNombreUsuario->numRow();
		return $q;
	}

	public function GetSucursales()
	{
	   $sucursales = new consultasDb('');
	   $sucursales->setConsulta('SELECT * FROM Sucursales');
	   $resultado_sucursales = $sucursales->query();
	   $sucursales_array= array();
	   while($row = $sucursales->fetchArray($resultado_sucursales))
	   {
			array_push($sucursales_array,$row);
	   }
	   
	   return $sucursales_array; 
	}
	
	public function getOperadoresMonitor()
	{	   
	   $operadores_monitor = new consultasDb('');
	   $operadores_monitor->setConsulta("SELECT * FROM operadores_monitor_view");
	   $resultado_operadores_monitor = $operadores_monitor->query();
	   $operadores_monitor->Desconectar();
	   
	   $operadores_monitor_array= array();
	   while($row = $operadores_monitor->fetchArray($resultado_operadores_monitor))
	   {
			array_push($operadores_monitor_array,$row);
	   }	   
	   return $operadores_monitor_array;
	}
	
	public function getOperadoresMonitorByID($OperadorMonitorID)
	{	   
	   $operadores_monitor = new consultasDb('');
	   $operadores_monitor->setConsulta("SELECT * FROM operadores_monitor_view WHERE OperadorMonitorID = ".$OperadorMonitorID);
	   $q = $operadores_monitor->query();
	   $resultado_operadores_monitor = $operadores_monitor->fetchArray($q);
	   $operadores_monitor->Desconectar();  
	   return $resultado_operadores_monitor;
	}
	
	public function getOperadoresSucursales()
	{	   
	   $operadores_sucursales = new consultasDb('');
	   $operadores_sucursales->setConsulta("SELECT * FROM operadores_monitores_sucursales");
	   $resultado_operadores_sucursales = $operadores_sucursales->query();
	   
	   $operadores_sucursales_array= array();
	   while($row = $operadores_sucursales->fetchArray($resultado_operadores_sucursales))
	   {
			array_push($operadores_sucursales_array,$row);
	   }	   
	   return $operadores_sucursales_array;
	}
	
	public function getPermisosAll(){
		
		try{
			
		   $permisos = new consultasDb('');
		   $permisos->setConsulta("SELECT p.*, m.Descripcion FROM permisos p
								   INNER JOIN modulos m ON m.ModuloID = p.ModuloID");
		   $resultado_permisos = $permisos->query();
		   
		   $permisos_array= array();
		   $permisos_temp = array();
		   
		   $operador_monitor = NULL;
		   $operador_monitor_aux = NULL;
		   while($row = $permisos->fetchArray($resultado_permisos))
		   {
				if($operador_monitor==NULL)
					$operador_monitor = $row["OperadorMonitorID"];
				
				$operador_monitor_aux = $row["OperadorMonitorID"];
				
				if($operador_monitor==$operador_monitor_aux){
					$permisos_temp[] = array("OperadorMonitorID"=>(int)$row["OperadorMonitorID"],
											 "RolID"=>(int)$row["RolID"],
											 "ModuloID"=>(int)$row["ModuloID"],
											 "Descripcion"=>(string)$row["Descripcion"],
											 "Lectura"=>(int)$row["Lectura"],
											 "Insercion"=>(int)$row["Insercion"],
											 "Modificacion"=>(int)$row["Modificacion"],
											 "Eliminacion"=>(int)$row["Eliminacion"]);
														
				}else{
					$permisos_array[] = array("Permisos"=>$permisos_temp);
					unset($permisos_temp);
					$permisos_temp[] = array("OperadorMonitorID"=>(int)$row["OperadorMonitorID"],
						 "RolID"=>(int)$row["RolID"],
						 "ModuloID"=>(int)$row["ModuloID"],
						 "Descripcion"=>(string)$row["Descripcion"],
						 "Lectura"=>(int)$row["Lectura"],
						 "Insercion"=>(int)$row["Insercion"],
						 "Modificacion"=>(int)$row["Modificacion"],
						 "Eliminacion"=>(int)$row["Eliminacion"]);
				}
		   }
   		   $permisos_array[] = array("Permisos"=>$permisos_temp);
	   
		   return $permisos_array;

		} catch (Exception $e) {
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}	
	}
	
	public function updatePermiso($parametros){
	   $update_permiso = new consultasDb('');
	   $update_permiso->setConsulta("CALL update_permisos(".$parametros["operador_monitor_id"].",".$parametros["modulo_id"].",".$parametros["permiso"].",".$parametros["permiso_valor"].");");
	   echo $update_permiso->getConsulta();
	   return $update_permiso->query();
	}
	
	public function getRoles()
	{	   
	   $roles = new consultasDb('');
	   $roles->setConsulta("SELECT * FROM roles");
	   $resultado_roles = $roles->query();
	   
	   $roles_array= array();
	   while($row = $roles->fetchArray($resultado_roles))
	   {
			array_push($roles_array,$row);
	   }	   
	   return $roles_array;
	}
	
	public function logout()
	{	
		if (isset($_SESSION['operador_sesion']['NombreUsuario']))
		{
			session_unset();
			session_destroy();
		}
		return true;
	}

	public function logeo($parametros)
	{
		try
		{
			if(!empty($parametros['nombre_usuario'])&&!empty($parametros['password']))
			{
				$this->setNombreUsuario($this->secure(trim($parametros['nombre_usuario'])));
				$this->setContrasena($this->secure(trim($parametros['password'])));

				if(!$this->validarContrasena())
					return false;
				
				if(!$this->iniciar())
					return false;
					
				return true;
			}
			return false;
		} 
		catch (Exception $e) 
		{
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}
	}
	
	public function secure($string) 
	{
		// Because some servers still use magic quotes
		if ( get_magic_quotes_gpc() ) :

			if ( ! is_array($string) ) :
				$string = htmlspecialchars(stripslashes(trim($string)));
			else :
				foreach ($string as $key => $value) :
					$string[$key] = htmlspecialchars(stripslashes(trim($value)));
				endforeach;
			endif;

			return $string;

		endif;


		if ( ! is_array($string) ) :
			$string = htmlspecialchars(trim($string));
		else :
			foreach ($string as $key => $value) :
				$string[$key] = htmlspecialchars(trim($value));
			endforeach;
		endif;

		return $string;
	}
	
	private function validarContrasena() 
	{
		$login_operador_sesions = new consultasDb("");
		$login_operador_sesions->setConsulta("SELECT * FROM monitor.operadores_monitor_view WHERE NombreUsuario = '".$this->getNombreUsuario()."';");
		$q = $login_operador_sesions->query();
		$this->datos_operador = $login_operador_sesions->fetchArray($q);
		$login_operador_sesions->desconectar();
		
		if(strlen($this->datos_operador['Contrasena']) == 32)
			return md5($this->getContrasena()) === $this->datos_operador['Contrasena'];	
		else
			return false;
	}	
	
	public function iniciar() 
	{
		try
		{
			// Almacena en sesion si el usuario esta deshabilitado
			if ($this->datos_operador['Habilitado'] == '0')
					return false;	
			
			// Expiracion de la sesion
			$login_settings = new consultasDb("configuraciones");
			$login_settings->select();
			$login_settings->where("ConfiguracionNombre = 'DuracionSesion'");
			$q = $login_settings->query();
			if($q == false)
				return false;
			
			$datos_operador = $login_settings->fetchArray($q);
			$login_settings->desconectar();
			
			ini_set('session.cookie_lifetime', 60*60*1);
			session_regenerate_id();
		
			 //Recuperar modulos accesibles por el usuario
//			 $modulos = new consultasDb("");
//			 $modulos->setConsulta("call get_permisos_operador_monitor(".$this->datos_operador['OperadorMonitorID'].")");			
//			 $q = $modulos->query();
//			 $modulos->desconectar();
//				
//			 $s_modulos = array();
//			 while($row = $modulos->fetchArray($q))
//			 {
//					$s_modulos[] = $row["ModuloID"];
//			 }				
//			 $_SESSION['operador_sesion']['modulosHabilitados'] = json_encode($s_modulos);	
	
			$_SESSION['operador_sesion']['NombreUsuario'] = $this->datos_operador['NombreUsuario'];
			$_SESSION['operador_sesion']['OperadorMonitorID'] = $this->datos_operador['OperadorMonitorID'];
			$_SESSION['operador_sesion']['rol'] = $this->datos_operador['RolID'];
			$ip = $this->getIP();
			$login_settings = new consultasDb("");
			$login_settings->setConsulta("call insert_logs_acceso(".$this->datos_operador['OperadorMonitorID']." ,1 ,'".(string)$ip."')");  
			$q = $login_settings->query();
			$login_settings->desconectar();
			if($q == false)
				return false;
			return true;

		} 
		catch (Exception $e) 
		{
			echo 'Excepción capturada: ',  $e->getMessage(), "\n";
		}
	}
	
	public function getPermisosLectura($operadorMonitorId)
	{
	   $permisos = new consultasDb('');
	   $permisos->setConsulta("SELECT p.ModuloID
							From Permisos p
							inner join Modulos m on m.ModuloId = p.ModuloId
							where OperadorMonitorID = ".$operadorMonitorId." AND Lectura = 1
							order by m.Orden;");
	   $resultado_permisos = $permisos->query();
	   
	   $permisos_array= array();
	   while($row = $permisos->fetchArray($resultado_permisos))
	   {
			array_push($permisos_array,$row[0]);
	   }	   
	   return $permisos_array;
	}
	
	public function getIP()
	{
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
        {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }elseif (isset($_SERVER['HTTP_VIA'])) 
        {
           $ip = $_SERVER['HTTP_VIA'];
        }elseif (isset($_SERVER['REMOTE_ADDR']))
        {
           $ip = $_SERVER['REMOTE_ADDR'];
        }else {
           $ip = "unknown";
        }
		return $ip;
	}
}
?>