<?php

//echo '<p>Tamaño: '.$tamanyoThumbnail.'</p>';

//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);


function traduceProceso($proceso,$subCarpeta){ //Esta funcion traduce la estructura original que tenían los procesos y sus carpetas en el SGA, para el proxy, ya que usará los procesos que están en las rutinas de Caché.
    
    $devolucion='';

    if($proceso=='entradas') {
        if($subCarpeta=='PuntosControl') $devolucion='PuntosControlEntrada';
        else $devolucion='Entrada';
    }
    else if($proceso=='cargas') {
        if($subCarpeta=='PuntosControl') $devolucion='PuntosControlCamion';
        else $devolucion='Carga';
    }
    else if($proceso=='salidas') {
        $devolucion='Salida';
    }
    
    return $devolucion;

}



class FotosDocumento {

	public $documento;
	public $numero;
	public $empresa;
	public $ruta;
	public $rutaHtml;
	
	public $rest_ws_url;
	public $proceso;
	
	public function __construct($documento,$numero,$empresa=NULL,$subCarpeta=NULL) {
	
		global $rutaPhp;
		global $rutaHtml;
		global $rest_ws_url;
		
		$this->documento=$documento;
		$this->numero=$numero;
		$this->empresa=$empresa;
		
		$this->rest_ws_url=$rest_ws_url;
		
		if( !$this->rest_ws_url ) { //15-10-2025 esto solo lo construimos (directorios) cuando NO es REST, sino que es SOAP y FTP
	
			$rutaFotos='/fotos';
			$rutaCompletaFotos=$rutaPhp.$rutaHtml.$rutaFotos;
			if( !file_exists($rutaCompletaFotos) && !$this->rest_ws_url ) {
				mkdir($rutaCompletaFotos);
				chmod($rutaCompletaFotos,0777);
			}
			
			//20-8-2020 detectamos que en un entorno multiempresa hay que separar las fotos
			if($this->empresa) {
				$rutaFotos.='/'.$this->empresa;
				$rutaCompletaFotos=$rutaPhp.$rutaHtml.$rutaFotos;
				if( !file_exists($rutaCompletaFotos) && !$this->rest_ws_url ) {
					mkdir($rutaCompletaFotos);
					chmod($rutaCompletaFotos,0777);
				}
			}
			
			$rutaDocumento='/'.$this->documento;
			$rutaCompletaFotosDocumento=$rutaCompletaFotos.$rutaDocumento;
			if( !file_exists($rutaCompletaFotosDocumento) && !$this->rest_ws_url ) {
				mkdir($rutaCompletaFotosDocumento);
				chmod($rutaCompletaFotosDocumento,0777);
			}
			
			$this->ruta=$rutaCompletaFotosDocumento.'/'.$numero;
			if( !file_exists($this->ruta) && !$this->rest_ws_url ) {
				$resultado=mkdir($this->ruta);
				chmod($this->ruta,0777);
			}
			
			$this->rutaHtml=$rutaHtml.$rutaFotos.$rutaDocumento.'/'.$numero;
			
			//20-01-2023
			if($subCarpeta) {
				$this->ruta=$rutaCompletaFotosDocumento.'/'.$numero.'/'.$subCarpeta;
				if( !file_exists($this->ruta) && !$this->rest_ws_url ) {
					$resultado=mkdir($this->ruta);
					chmod($this->ruta,0777);
				}
				
				$this->rutaHtml=$this->rutaHtml.'/'.$subCarpeta;
			}
			
		}
		
		$this->proceso=traduceProceso($this->documento,$subCarpeta); //Esta rutina traduce el nombre del documento al nombre de proceso en Cache, para las llamadas al proxy
		
		if($traza) {
			echo '<p>### CONSTRUCTOR ###';
			echo '<p>REST: '.$this->rest_ws_url.'</p>';
			if(!$this->rest_ws_url) {
				echo '<p>Ruta fotos: '.$rutaFotos.'</p>';
				echo '<p>Ruta documento: '.$rutaDocumento.'</p>';
				echo '<p>Ruta: '.$this->ruta.'</p>';
				echo '<p>Resultado de crear el directorio: '.$resultado.'</p>';
				echo '<p>Ruta completa fotos: '.$this->rutaHtml.'</p>';
			}
			echo '<p>Proceso: '.$this->proceso.'</p>';
			
		}
	
	}
	
	public function fotosSubidas($sufijo=NULL) {
	
		$fotosSubidas = array();
	
		if( $this->rest_ws_url ) {
		
			$datos=array(
				'proceso'=>$this->proceso,
				//'proceso'=>$this->documento,
				'id'=>$this->numero,
				'empresa'=> $this->empresa
			);
			
			$resultado=peticionProxy('docsUsuarios/listado',$datos);
        
        	//print_r($resultado);

        	if($resultado->valor==1){
            
            	foreach(json_decode($resultado->data) as $archivo) {
                
                	if($sufijo) {
                    	$nombreSolo=substr($archivo,0,strlen($archivo)-4); //le quitamos ".jpg";
                    	$coincidencia=substr($nombreSolo,strlen($nombreSolo)-strlen($sufijo),strlen($sufijo));
                    	if($coincidencia==$sufijo) {
                        	$fotosSubidas[] = $archivo;
                    	}
                	}
                	else {
                    	$fotosSubidas[] = $archivo;
                	}

            	}
            
            }
		
		}
		else {
		
			$directorio = opendir($this->ruta);
			
			while ($archivo = readdir($directorio)) {
			
				//echo '<p>'.$this->ruta.'/'.$archivo.' >>>> Es directorio: '.is_dir($this->ruta.'/'.$archivo).'</p>';
				//if( $archivo != "." && $archivo != "..") {
				if( !is_dir($this->ruta.'/'.$archivo) && $archivo!='Thumbs.db' ) {
					if($sufijo) {
						$nombreSolo=substr($archivo,0,strlen($archivo)-4); //le quitamos ".jpg";
						$coincidencia=substr($nombreSolo,strlen($nombreSolo)-strlen($sufijo),strlen($sufijo));
						if($coincidencia==$sufijo) {
							$fotosSubidas[] = $archivo;
						}
					}
					else {
						$fotosSubidas[] = $archivo;
					}
				}
				
			}
			
		}
		
		return $fotosSubidas;
	
	}
	
	public function verFoto($archivo) {
	
		$datos=array(
			'proceso'=>$this->proceso,
			//'proceso'=>$this->documento,
			'id'=>$this->numero,
			'empresa'=>$this->empresa,
			'archivo'=>$archivo
		);
		
		$resultado=peticionProxy('docsUsuarios/descarga',$datos);
    
    	if($resultado->valor==1) {
			echo $resultado->data;
        }
		
	}
	
	public function grabaFoto($archivoOrigen,$nombreArchivo=NULL) {
	
		global $rutaHtml;
		global $tamanyoThumbnail;
		global $duplicarArchivoImagenProblemaPrivilegios;
		
		global $traza;
	
		if($nombreArchivo) $nombre=$nombreArchivo;
		else $nombre=bin2hex(random_bytes(16)).'.jpg';
		
		//echo '<hr>';
		//echo '<p>Nombre foto subida: '.$nombre.'</p>';
	
		
		if($this->rest_ws_url) {
			$dirTemporal=$_SERVER["DOCUMENT_ROOT"].$rutaHtml.'/fotos/tmp';
			//echo '<p>dirTemporal: '.$dirTemporal.'</p>';
			if( !file_exists($dirTemporal) ) {
				mkdir($dirTemporal);
				chmod($dirTemporal,0777);
			}
			$archivoSubido=$dirTemporal.'/'.$nombre;
		}
		else {
			$archivoSubido=$this->ruta.'/'.$nombre;
		}
		
		//echo '<p>archivoOrigen: '.$archivoOrigen['tmp_name'].'</p>';
		//echo '<p>archivoSubido: '.$archivoSubido.'</p>';
		
		if($archivoOrigen['tmp_name']!=$archivoSubido) {
			$subida=move_uploaded_file($archivoOrigen['tmp_name'],$archivoSubido);
		}
		else {
			//En este caso, ya existe un temporal, puesto que la foto se ha tomado por javascript directamente y ya existe en la carpeta temporal
			$subida=true;
		}
		
		//echo '<p>subida: '.$subida.'</p>';
		
		
		if($subida){

			
			//13-05-2025 EXIF NO SOPORTA PNG, así que convertimos antes
			$trozos=explode('.',$nombre);
			$extension=$trozos[count($trozos)-1];
			$duplicadoNombre='';
			for($i=0;$i<count($trozos)-1;$i++) $duplicadoNombre.=$trozos[$i];
			if($extension=='png') {
				$imagenOriginal = imagecreatefrompng($archivoSubido);
				$result=imagejpeg($imagenOriginal,$archivoSubido);
			}
			
			//ini_set('display_errors', 1);
			//ini_set('display_startup_errors', 1);
			//error_reporting(E_ALL);
			
			$exif = exif_read_data($archivoSubido);
			
			//echo '<p>Info EXIF:</p>';
			//print_r($exif);
			
			
			
			switch ($exif['Orientation']) {
				case 3:
					$angle=180;
					$ancho=$exif['COMPUTED']['Width'];
					$alto=$exif['COMPUTED']['Height'];
					break;
				case 6:
					$angle=-90;
					$ancho=$exif['COMPUTED']['Height'];
					$alto=$exif['COMPUTED']['Width'];
					break;
				case 8:
					$angle=90;
					$ancho=$exif['COMPUTED']['Height'];
					$alto=$exif['COMPUTED']['Width'];
					break;
				default:
					$angle=0;
					$ancho=$exif['COMPUTED']['Width'];
					$alto=$exif['COMPUTED']['Height'];
			}
		
					
			//2-10-2023 comento esta linea porque no tiene sentido, no le veo utilidad (está más abajo) y falla porque ese archivo no existe		
			//$archivo = imagerotate($archivo, $angle, 0);
			
			if($traza) {
				echo "<p>ancho: ".$ancho."</p>";
				echo "<p>alto: ".$alto."</p>";
				echo '<p>tamanyoThumbnail: '.$tamanyoThumbnail.'</p>';
			}
				
			if(isset($tamanyoThumbnail) && $tamanyoThumbnail) {	
				if($ancho>=$alto) {
					$nuevoAlto = round($alto*$tamanyoThumbnail/$ancho,0);   
					$nuevoAncho=$tamanyoThumbnail;
				}
				else {
					$nuevoAncho = round($ancho*$tamanyoThumbnail/$alto,0);
					$nuevoAlto =$tamanyoThumbnail;   
				}
			}
			else {
				$nuevoAncho=$ancho;
				$nuevoAlto=$alto;
			}
					
			//echo "<p>nuevoAncho: ".$nuevoAncho."</p>";
			//echo "<p>nuevoAlto: ".$nuevoAlto."</p>";
	

			
			if($exif['MimeType']=='image/png'){
				$imagenOriginal = imagecreatefrompng($archivoSubido);
			}
			else {
				$imagenOriginal = imagecreatefromjpeg($archivoSubido);
			}
			

			$imagenOriginal = imagerotate($imagenOriginal, $angle, 0);

			$imagenThumbnail = imagecreatetruecolor($nuevoAncho,$nuevoAlto);

			imagecopyresampled($imagenThumbnail,$imagenOriginal,0,0,0,0,$nuevoAncho,$nuevoAlto,$ancho,$alto);

			imagejpeg($imagenThumbnail,$archivoSubido);

			
			
			//////////////////////// 12-05-2025 INTEGRACIÓN FOTOS REST ///////////////////////
			
			if($this->rest_ws_url) {
            
            	//echo '<p>Comienza proceso envio al proxy por REST</p>';
				
				
				
				$contenidoBinario = file_get_contents($archivoSubido);
				$imagenComoBase64 = base64_encode($contenidoBinario);
				
				$datos=array(
					'proceso'=>$this->proceso,
					//'proceso'=>$this->documento,
					'id'=>$this->numero,
					'empresa'=>$this->empresa,
					'archivo'=>$nombre,
					'datos'=>$imagenComoBase64
				);
            
            	//print_r($datos);
				
				
				
				$resultado=peticionProxy('docsUsuarios/upload',$datos);
				
				unlink($archivoSubido);
            
            	//echo '<p>Resultado peticion REST:</p>';
            	//print_r($resultado);
            
            	if($resultado->valor==1) return true;
				else return false;
				
				
			
			}
			else {
			
				if($duplicarArchivoImagenProblemaPrivilegios) {
					//02-06-2022 Se detecta que el archivo creado con imagjpeg en las ultimas versiones de win IIS
					//no hereda los permisos de la carpeta padre.
					//sin embargo los metodos de gestion de archivos convencionales, crear dir, copiar, etc
					//si que los heredan. Así que hacemos esta trampa:
					copy($archivoSubido,$archivoSubido.'-temp');
					unlink($archivoSubido);
					rename($archivoSubido.'-temp',$archivoSubido);
				}
				
				if(file_exists($archivoSubido)) {
					chmod($archivoSubido,0777);
					return true;
				}
				else return false;
			
			}
			
			
			
		}
		else return false;
		
		
		
	
	}
	
	public function borraFoto($nombre) {
	
		if($this->rest_ws_url) {
		
			$datos=array(
				'proceso'=>$this->proceso,
				//'proceso'=>$this->documento,
				'id'=>$this->numero,
				'empresa'=>$this->empresa,
				'archivo'=>$nombre
			);
			
			$resultado=peticionProxy('docsUsuarios/borrado',$datos);
			
		}
		else {
	
			return unlink($this->ruta.'/'.$nombre);
			
		}
		
	}

}

?>