<?php
/**
	Clase Objeto
*/

//ini_set('include_path', '..' . PATH_SEPARATOR . get_include_path());

class SuperObjeto {
	public static $campos_tabla = array();
	public static $alias = '';
	public static $nombreTabla = '';
	public static $camposSelect = '';
	public static $whereSelect = '';
	
    function __construct(){
    }
    function __destruct(){
    }
	
	/*public function initCampos(){
		if (self::$alias != ''){
			include('comunes/diccionario/diccionario.php');
			self::$campos_tabla = ${$alias};
			self::$camposSelect = BaseDatos::dameCamposAlias(self::$campos_tabla, self::$alias);
		}
	}*/
	
	public static function getCampos(){
		//Vamos a ver desde qué clase estamos llamando y vamos a obtener la tabla de la base de datos
		self::getNombreTabla();
		self::getAlias();
		//Una vez que tenemos el nombre de la tabla, vamos a obtener los campos de la misma y los nombres para la selec
		if (self::$nombreTabla != ''){
			//include('comunes/diccionario/diccionario.php');
			//self::$campos_tabla = BaseDatos::$dictionary->{self::$nombreTabla . 'Campos'};
			self::$campos_tabla = BaseDatos::dameCampos(self::$nombreTabla);
			self::$camposSelect = BaseDatos::dameCamposAlias(self::$campos_tabla, self::getAlias());
		}
		return(self::$camposSelect);
	}
	
	public static function getAlias(){
		self::getNombreTabla();
		//Una vez que tenemos el nombre de la tabla, vamos a obtener los campos de la misma y los nombres para la selec
		if (self::$nombreTabla != ''){
			//include('comunes/diccionario/diccionario.php');
			//self::$alias = BaseDatos::$dictionary->{self::$nombreTabla . 'Alias'};
			self::$alias = BaseDatos::dameAlias(self::$nombreTabla);
		}
		return(self::$alias);
	}
	
	public static function getNombreTabla(){
		self::$nombreTabla = strtolower(get_called_class());
		self::getTablaRelacionada();
		return(self::$nombreTabla);
	}
	
	public static function getNombreTablaSinAlias(){
		$nombreTabla = self::getNombreTabla();
		//Del nombre de la tabla hay que quitar el alias porque lo queremos así:
		$cadQuitar = ' as `' .  self::getAlias() . '` ';
		str_replace($cadQuitar, '', $nombreTabla);
		return($nombreTabla);
	}
	
	
	
	//Mediante esta función estableceré la correspondencia para aquellas tablas que no se llamen igual que las clases:
	public static function getTablaRelacionada($nombreTabla = NULL){
		//Cuando no nos pasen el nombre de la tabla lo calculamos a partir de la clase, Si no, lo hacemos así
		$resultado = $nombreTablaComprobar = $nombreTabla;
		if ($nombreTablaComprobar == NULL){
			$resultado = $nombreTablaComprobar = self::$nombreTabla;
		}
		switch($nombreTablaComprobar){
			case 'traduccionarticulo':
				$resultado = 'traducarti';
			break;
			case 'seoarticulo':
				$resultado = 'articulo_seo';
			break;
			case 'pedidocliente':
				$resultado = 'mc_pedcli';
			break;
			case 'lineapedidocliente':
				$resultado = 'ml_pedcli';
			break;
			case 'tipoenviocliente':
				$resultado = 'tipo_envio_cli';
			break;
			case 'formaspago':
				$resultado = 'formas_de_pago';
			break;
			case 'usuario':
				$resultado = 'cliente';
			break;
			case 'ebook':
				$resultado = 'descargas_ebook';
			break;
			case 'lineacesta':
				$resultado = 'tmp_linea_pedidos';
			break;
			case 'cabeceracesta':
				$resultado = 'tmp_cabecera_pedidos';
			break;
			case 'busqueda':
				$resultado = 'search_index';
			break;
			case 'ofertasregalo':
				$resultado = 'ofertas_regalo';
			break;
			case 'escaparate':
				$resultado = 'cescaparate';
			break;
			case 'lineaalbaran':
				$resultado = 'lin_albaran';
			break;
			case 'albaran':
				$resultado = 'cab_albaran';
			break;
		}
		if ($nombreTabla == NULL){
			self::$nombreTabla = $resultado;
		}
		return($resultado);
	}
	
	public static function getWhereTabla(){
		return('');
	}
	
	public static function getJoin($tOrigen, $cOrigen, $tDestino, $cDestino, $listaCondiciones = NULL, $listaOperadores = NULL, $left = ' LEFT JOIN '){
		$sentencia = '';
		//Si no hemos recibido lista de condiciones, las inicializamos a "AND":
		$listaCondiciones = ($listaCondiciones == NULL) ? array(' AND ') : $listaCondiciones;
		//La lista operadores es igual, pero la inicializamos con '='
		$listaOperadores = ($listaOperadores == NULL) ? array(' = ') : $listaOperadores;
		//Esta función la modificaremos en un futuro para pasarle arrays de campos que comparar, por ahora se casa sólo 1 campo
		//Vamos a actuar de manera diferente según si es clase y es hija de "Objeto" o si no:
		$aliasDestino = '';
		$nombreTablaDestino = '';

		try{
			if (class_exists($tDestino)){
				if (is_subclass_of($tDestino, 'Objeto')){
					$aliasDestino = $tDestino::getAlias();
					$nombreTablaDestino = $tDestino::getNombreTabla(true);
				}
			}
		}catch(Exception $e){
			//Si pasa por aquí sabemos que la clase no existe
		}

		//Si alguno de los valores no está seteados, los cogemos de la manera tradicional
  		$nombreTablaDestino = ($nombreTablaDestino == '') ? $tDestino : $nombreTablaDestino;
		//$aliasDestino = ($aliasDestino == '') ? BaseDatos::$dictionary->{strtolower($nombreTablaDestino) . 'Alias'} : $aliasDestino;
		$aliasDestino = ($aliasDestino == '') ? BaseDatos::dameAlias($nombreTablaDestino) : $aliasDestino;
		
		//Esto no funciona si no es una subclase de "objeto"
		//if ( (is_subclass_of($tOrigen, 'Objeto')) && (is_subclass_of($tDestino, 'Objeto')) ){
			//Si alguno de los campos que tiene q ser array no lo es, lo inicializamos como tal
			if (!is_array($cOrigen)){
				$cOrigen = array($cOrigen);
			}
			if (!is_array($cDestino)){
				$cDestino = array($cDestino);
			}
			if (!is_array($listaCondiciones)){
				$listaCondiciones = array($listaCondiciones);
			}
			if (!is_array($listaOperadores)){
				$listaOperadores = array($listaOperadores);
			}
			if (count($cOrigen) > 0 && count($cDestino) > 0){
				$sentencia = $left . ' '. $nombreTablaDestino;
				//Si la sentencia no tiene el ' as ' es que no lleva alias, vamos a meterlo:
				if (strpos($sentencia, ' as ') === false) {
					$sentencia .= ' as `' . $aliasDestino . '` ';
				}
				$sentencia .=  ' on ( ';
				//Cogemos el array más grande:
				$limite = max(count($cOrigen), count($cDestino), count($listaCondiciones), count($listaOperadores));
				//Vamos a hacer un bucle for porque nos pueden mandar arrays con índices que no sean numéricos
				$where = '';
				//Por seguridad inicializo estas dos variables, pero ya me he asegurado de que ambos arrays tengan, al menos, 1 elemento
				$elementoOrigen = '';
				$elementoDestino = '';
				$condicion = '';
				$operador = '';
				for ($i = 0; $i < $limite; $i++){
					//Cogemos el último elemento disponible para los elementos, la condición y el operador
					$elementoOrigen = (isset($cOrigen[$i])) ? $cOrigen[$i] : $elementoOrigen;
					$elementoDestino = (isset($cDestino[$i])) ? $cDestino[$i] : $elementoDestino;
					$operador = (isset($listaOperadores[$i])) ? $listaOperadores[$i] : $operador;

					//Componemos las partes teniendo en cuenta que puede haber un literal. Usamos una función para no duplicar código
					$leftPart = static::getWeherePart($tOrigen, $elementoOrigen);
					$rightPart = static::getWeherePart($tDestino, $elementoDestino);
					if ( ($leftPart . $rightPart) != ''){
						$where .= ($where != '') ? $condicion : '';
						$where .= $leftPart . $operador . $rightPart;
					}
					//La condición la cogemos al final porque en la primera vuelta, nunca habrá condición
					$condicion = (isset($listaCondiciones[$i])) ? $listaCondiciones[$i] : $condicion;
				}
				$sentencia .= $where . ' ) ';
			}
		//}
		return($sentencia);
	}
	
	private static function getWeherePart($table, $field){
		//Siempre que recibamos una cadena que empieza por $, es un literal y no un campo de la tabla
		$part = '';
		if (substr($field, 0, 1) == '$'){
			$part = ' "' . substr($field, 1) . '" ';
		}else{
			//Ojo que puede que la tabla recibida no tenga clase asociada:
			$aliasDestino = '';
			try{
				if (class_exists($table)){
					if (is_subclass_of($table, 'Objeto')){
						$aliasDestino = $table::getAlias();
						$nombreTablaDestino = $table::getNombreTabla(true);
					}
				}
			}catch(Exception $e){
				//Si pasa por aquí sabemos que la clase no existe
			}
			//Si alguno de los valores no está seteados, los cogemos de la manera tradicional
			//$aliasDestino = ($aliasDestino == '') ? BaseDatos::$dictionary->{strtolower($table) . 'Alias'} : $aliasDestino;			
			$aliasDestino = ($aliasDestino == '') ? BaseDatos::dameAlias($table) : $aliasDestino;			
			$part = ' `' . $aliasDestino . '`.`' . $field . '` ';
		}
		return($part);
	}
	
	public function getProp($array, $property, $alias = NULL){
		$retorno = NULL;
		if (is_array($array)){
			$alias = ($alias == NULL) ? self::getAlias() : $alias;
			if (isset($array[$alias . '_' . $property])){
				$retorno = $array[$alias . '_' . $property];
			}
		}
		return($retorno);
	}
}
?>