<?php namespace App\Libraries;

require_once "host.php";

// Clase encargada de gestionar las conexiones a la base de datos
use SoapClient;
use mcrypt;

Class ejLib{
	static $_instance;									//Instancia de  la clase

	//La funci�n construct es privada para evitar que el objeto pueda ser creado mediante new
	private function __construct(){ //$this->conectar();
	}

	//Evitamos el clonaje del objeto. Patr�n Singleton
	private function __clone(){ }

	//Función encargada de crear, si es necesario, el objeto. Esta es la funci�n que debemos llamar desde fuera de la clase para instanciar el objeto, y as�, poder utilizar sus m�todos
	public static function getInstance(){
		if (!(self::$_instance instanceof self)){ self::$_instance=new self(); }
		return self::$_instance;
	}


	//Método para obtener la IP real del equipo cliente solicitante
	public function getRealIP(){
		$ipaddress = '';
		if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP');
		else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
		else if(getenv('HTTP_X_FORWARDED'))	$ipaddress = getenv('HTTP_X_FORWARDED');
		else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR');
		else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED');
		else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR');
		else $ipaddress = 'UNKNOWN';
	 	return $ipaddress;
	}

	//Método para obtener el nombre de equipo real del cliente solicitante
	public function getRealHost(){
		$ip=$this->getRealIP(); if($ip!='UNKNOWN')return gethostbyaddr($ip); else return 'UNKNOWN';
	}

	public function getWs(){
		$soapclient = new SoapClient(trim(URLWS)); 
		return $soapclient;
	}

	public function get_wsClave(){ return trim(KEYTEXT); }
	
	public function get_urlWsCurp(){ return trim(URLWSCURP); }
	
	public function getKeySession(){ return trim(KEYSESSION);} 

	public function getKeyIV(){ $iv_length = openssl_cipher_iv_length("aes-256-cbc"); $iv = openssl_random_pseudo_bytes($iv_length); return $iv; } 

	public function encriptar_AES($string, $iv){
		// $encrypted_data = mcrypt_encrypt(MCRYPT_BLOWFISH, $this->getKeySession(), $string, MCRYPT_MODE_CBC, $iv);    	
    	$encrypted_data = openssl_encrypt($string, "aes-256-cbc", trim(KEYSESSION), OPENSSL_RAW_DATA, $iv);
    	$string_cc = base64_encode($encrypted_data);
	    return $string_cc;
	}

	public function desencriptar_AES($encrypted_data_ex, $iv){
		$encrypted_data = base64_decode($encrypted_data_ex);
	    //$decoded = mcrypt_decrypt(MCRYPT_BLOWFISH, $this->getKeySession(), $encrypted_data, MCRYPT_MODE_CBC, $iv);
	    $decoded = openssl_decrypt($encrypted_data, "aes-256-cbc", trim(KEYSESSION), OPENSSL_RAW_DATA, $iv);
	    return $decoded;
	}

	/*public function getView($vista, $parametros){ //LI Juan Pablo Sánchez Bracamontes . 21 Dic 2016 . Función para recuperar una ruta a una vista de Laravel
		$sUrl = action(trim('App\Http\Controllers\ ').$vista); //Recuperación de la url de la vista		
		if(defined('serverHTTPS') && serverHTTPS === '1')$sUrl = str_replace("http://", "https://", $sUrl);
		$params = array('http' => array('method' => 'POST','content' => 'x_=0&'.$parametros)); //Constructor de los parámetros en el arreglo
		$ctx = stream_context_create($params); //Creamos un flujo con los parámetros
		$fp = @fopen($sUrl, 'rb', false, $ctx); //Realizamos una consulta a la vista que se necesita enviandole los parámetros en un flujo
		return @stream_get_contents($fp); //Retornamos los resultados
	}*/

	public function getView($vista, $parametros){ //LI Juan Pablo Sánchez Bracamontes . 21 Dic 2016 . Función para recuperar una ruta a una vista de Laravel

/*		$sUrl = action(trim('App\Http\Controllers\ ').$vista);

		$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
		//Basically adding headers to the request
		$context = stream_context_create($opts);
		$html = file_get_contents($sUrl,false,$context);
		$html = htmlspecialchars($html);

		return $html;
*/
		
		$sUrl = action(trim('App\Http\Controllers\ ').$vista);				
		if(defined('serverHTTPS') && serverHTTPS === '1')$sUrl = str_replace("http://", "https://", $sUrl);
		$opciones = array('http' =>
			array(
				'method'  => 'POST',
				'header'  => "Content-type: application/x-www-form-urlencoded\r\nUser-Agent:MyAgent/1.0\r\n",
				'content' => 'x_=0&'.$parametros
			)
		);

		$contexto  = stream_context_create($opciones);
		$resultado = file_get_contents($sUrl, false, $contexto);
		return $resultado;
		
	}


	public function getNOption($nObj, $nSelected=0){ //LI Juan Pablo Sánchez Bracamontes . 23 Ene 2017 . Función para recibir el numero de elementos y retornar una cadena string con la definición de un arreglo de options para el llenado de selects de tipo hora y minutos
		$cadenaFinal='';$i=0;
		if($nObj=='')$nObj=0;
		if($nObj>0){
			while(++$i<=$nObj){
				$val=str_pad(($i-1), 2, "0", STR_PAD_LEFT);
				if($nSelected == ($i-1))
					$cadenaFinal.='<option value="'.$val.'" selected="selected">'.$val.'</option>';
				else
					$cadenaFinal.='<option value="'.$val.'">'.$val.'</option>';
			}
		}
		return $cadenaFinal;
	}

    // 05-dic-2019 
    // Función para buscar registros con los que concuerde el valor proporcionado usando una columna determinada
    public function get_findRow_withCol_byValue($objeto_filtrar, $columna_filtro, $valor_busqueda, $todos = false)
    {	
        if(!$todos)
        {
            foreach($objeto_filtrar as $row)
            { if($valor_busqueda == ''.$row[$columna_filtro]){ return $row; } }
        }
        else
        {
            $lst_row = array(); foreach($objeto_filtrar as $row)
            { if($valor_busqueda == ''.$row[$columna_filtro]){ array_push($lst_row, $row); } } return $lst_row;
        }		
        return array();
    }

    public function getMomentoActual(){ 
    	$mifecha= date('Y-m-d H:i:s');
    	if(defined('RESTARHORA') && RESTARHORA === 'S'){    		
			$NuevaFecha = strtotime ( '-1 hour' , strtotime ($mifecha) ) ; 			
			$mifecha = date ( 'Y-m-d H:i:s' , $NuevaFecha); 
    	}
    	return $mifecha;
    }

}
?>
