<?php 
function chdir_nuestro() { //Simple: sin parámetro, sólo se sabe que va al __DIRINICIAL__. 
							//Esto nos permite usar la función donde, por contexto, el usuario programador
						   //sepa que estamos libres de riesgo y pueda programar con tranquilidad.
       chdir(__DIRINICIAL__); //Garantiza que el current directory sea el del index.php
} //Fin de chdir_nuestro

function json_py_____to_____php_array($ruta_alias) {	
	$r = rutas($ruta_alias);	
	//$r es la ruta al script de _json.py
	if(!FILE_EXISTS($r)) {
	    error_con_header("##Error20260227_162733-3063dav: No existe el archivo '$r'");
	}		
	$sys_append  = dirname($r);
	$module_name = basename($r);
	$rjp_sin_ext = preg_replace("~\.py$~", "", $r);
	
	//$comando="python -c \"import sys; sys.path.append($sys_append); import servidor_config_json as s; \" ";
	$comando="python -c \"import sys; sys.path.append(r'$sys_append'); import pprint; import servidor_config_json as s; pprint.pprint(s.config)\" ";
	echo $comando;
	return;
	$v = exec($comando, $return, $output);
	if($v===FALSE) {
		error_con_header("##Error20260315180243-0392dav: No ejecutó correctamente el comando $comando. Output: \n " .
				"\$return: " . var_export($return, TRUE) . "\n" .
				"\$output: " . var_export($output, TRUE)
				);
	}
	echo implode("\n", $output);
} //Fin de json_py_____to_____php_array

function rutas($ruta_alias) {
	switch($ruta_alias) {
		CASE "HOME":
			switch(sistema_operativo()) {
				case "linux":
					//Método 1: Tomado de https://stackoverflow.com/questions/20535474/php-get-user-home-directory-for-virtual-hosting
					$user = posix_getpwuid(posix_getuid());
					$home_path = $user['dir'];			
					break;
				case "windows":
					//##ABAJO: si esta condición con and se pone en una sola línea sin paréntesis con el resto 
					// del condicional ternario, la agrupación es tal que al final $home_path termina teniendo un valor 
					// booleano, que no es lo que deseamos. Luego para mayor claridad para el usuario-programador,
					// se separa la condición en una línea aparte.
					//##ABAJO: se prefiere $_SERVER["USERPROFILE"] primero que $_SERVER["HOMEPATH"] ya que USERPROFILE
					//         (al menos en la versión de Wamp donde lo probé) incluye la unidad c:, ello es más claro 
					//         para agilidad de depuraciones.
					$condicion = (isset($_SERVER["USERPROFILE"]) and $_SERVER["USERPROFILE"]);
					$home_path = ($condicion) ? $_SERVER["USERPROFILE"] : $_SERVER["HOMEPATH"]; 					
					break;
			}
			break;			
		CASE "servidor_config_json.py":
			$ps = DIRECTORY_SEPARATOR;
			$home_path = get_home() . "{$ps}home_nuestro{$ps}proyectos{$ps}SOLO-SERVIDOR{$ps}geminis-gpbolivar-facturacion{$ps}actualizar{$ps}servidor_config_json.py";
			break;
		DEFAULT:
			break;
	} //Fin del switch
	return $home_path;
} //Fin de rutas

function get_home() {
	return rutas("HOME");
} //Fin de get_home

function sistema_operativo() { //Aquí se controlan opciones inexistentes. Es decir, se controla en un solo lugar.
	//##referencias: 
	//      [1] https://www.php.net/manual/en/function.php-uname.php
	/*En [1] dicen: <<php_uname() returns a description of the operating system PHP is running on. This is the same string you see at the very top of the phpinfo() output. For the name of just the operating system, consider using the PHP_OS constant, but keep in mind this constant will contain the operating system PHP was built on.

		On some older UNIX platforms, it may not be able to determine the current OS information in which case it will revert to displaying the OS PHP was built on. This will only happen if your uname() library call either doesn't exist or doesn't work.
		>>
		$php_os = strtolower(PHP_OS); 		
		uname('o'); -->otra que se podría probar.
	*/
	$php_os = strtolower( php_uname('s') ); 
	switch($php_os) {
		case "winnt":
		case "windows32":
		case "windows":
		case "windows nt":
			$r = "windows";
			break;
		case "linux":
		case "gnu/linux":
			$r = "linux";
			break;
		default:
			error_con_header("##Error20260316044852-4051: no se ha comprendido el valor de \$php_os '" . $php_os . "'");
			break;
	}
	return $r;
} //Fin de sistema_operativo

function Clase($nombre_clase, $info_contexto_en_error="") {
	//desde el nombre de la clase pasamos a la clase abstracta (antes de instanciarse)
	//pasamos a la clase abstracta (antes de instanciarse). 
	//En otros lenguajes también se puede hacer. 
	/*Por ejemplo en python, hay al menos dos métodos:
		globals()["Nombre-de-la-clase"]
		
		https://stackoverflow.com/questions/63174650/how-can-i-get-a-class-by-its-name-in-python
	  Y en php preguntan lo mismo en este otro foro:
		https://stackoverflow.com/questions/69337315/how-to-get-class-by-name-in-php
	*/
	$clase_abstracta_en_php = $nombre_clase;
	if(!class_exists($nombre_clase)) {
		$m = "##20260415173510-4053dav: No existe la clase $nombre_clase.";
		$m .= " $info_contexto_en_error";
		$m = trim($m);
		error_y_salir($m);
	}	
	return $clase_abstracta_en_php;
} //Fin de tabla_to_clase
