<?php

class AppHerramienta {

	const FECHA_MES = 'mes';
	const FECHA_DIA = 'dia';

	/*
	private static function objectToObject($instance, $className) {
		return unserialize(sprintf(
				'O:%d:"%s"%s',
				strlen($className),
				$className,
				strstr(strstr(serialize($instance), '"'), ':')
		));
	}
	*/	
	
	public static function ficheroGetExtension($fichero){
		$trozos = explode(".", $fichero);
		$extension = end($trozos);
		return $extension;
		
	}
	
	
	public static function copiarFichero($source, $dest){
		if (!copy($source, $dest)) {
		echo "Error al copiar $archivo...\n";
		}
	}
	
	public static function copiarSoloDirectorios($dir, $mode = 0777, $recursive = true) {
		$separador_directorio = AppHerramienta::getBarraDirectorio();
		if( is_null($dir) || $dir === "" ){
			return FALSE;
		}
		if( is_dir($dir) || $dir === $separador_directorio ){
			return TRUE;
		}
		if( self::copiarSoloDirectorios(dirname($dir), $mode, $recursive) ){
		 return mkdir($dir, $mode);
		}
		return FALSE;
	}
	
	
	
	public static function copiarFicheroNO($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755))
		{
			$separador_directorio = AppHerramienta::getBarraDirectorio();
			$result=false;
			 
			if (is_file($source)) {
				echo $dest;
				echo '11:'.$dest[strlen($dest)-1];
				if ($dest[strlen($dest)-1]==$separador_directorio) {
					echo '12';
					if (!file_exists($dest)) {
						self::makeAll($dest,$options['folderPermission'],true);
					}
					$__dest=$dest.$separador_directorio.basename($source);
				} else {
					$__dest=$dest;
				}
				//echo $source;
				//echo $__dest;
				$result=copy($source, $__dest);
				chmod($__dest,$options['filePermission']);
				 
			} elseif(is_dir($source)) {
				if ($dest[strlen($dest)-1]=='/') {
					if ($source[strlen($source)-1]==$separador_directorio) {
						//Copy only contents
					} else {
						//Change parent itself and its contents
						$dest=$dest.basename($source);
						@mkdir($dest);
						chmod($dest,$options['filePermission']);
					}
				} else {
					if ($source[strlen($source)-1]==$separador_directorio) {
						//Copy parent directory with new name and all its content
						@mkdir($dest,$options['folderPermission']);
						chmod($dest,$options['filePermission']);
					} else {
						//Copy parent directory with new name and all its content
						@mkdir($dest,$options['folderPermission']);
						chmod($dest,$options['filePermission']);
					}
				}
		
				$dirHandle=opendir($source);
				while($file=readdir($dirHandle))
				{
					if($file!="." && $file!="..")
					{
						if(!is_dir($source.$separador_directorio.$file)) {
							$__dest=$dest.$separador_directorio.$file;
						} else {
							$__dest=$dest.$separador_directorio.$file;
						}
						//echo "$source/$file ||| $__dest<br />";
						$result=smartCopy($source.$separador_directorio.$file, $__dest, $options);
					}
				}
				closedir($dirHandle);
				 
			} else {
				$result=false;
			}
			return $result;
		}
		

	
	public static function getFicherosDeCarpeta($directorio){
		
		$barra = self::getBarraDirectorio();
		$res = array();
		if (is_dir($directorio)){
			$files = scandir($directorio);
			foreach ($files as $file) {
				if ($file && is_file($directorio.$barra.$file)){
					$res[] = $file;
				}
			}
		}

		
		return $res;
	}
	
	public static function getBarraDirectorio(){
		if (strtoupper(substr(PHP_OS, 0, 3)) === "WIN") {
			$barra = "\\";
		} else {
			$barra = "/";
		}
		return $barra;
	}
	
	public static function siNoVacio($param){
		if (isset($param) && $param) return true;
		else false;
		
	}
	
	public static function getUrlActual(){
		$domain = $_SERVER['HTTP_HOST'];
		$url = "http://" . $domain . $_SERVER['REQUEST_URI'];
		return $url;
	}

	public static function numeroQuitarComas($numero)
	{
		return str_replace(',','.',$numero);
	}
	
	/**
	 * Trasformamos una fecha Mysql 2012-12-31 en formato de fecha humana
	 * 31/12/2012
	 *
	 * @param string $fechaMysql
	 * @return string Fecha Humana
	 */
	public static function fechaMysqlAHumana($fechaMysql) {
		$d = new DateTime ( $fechaMysql );
		$value = $d->format ( 'd/m/Y' );
		return $value;
	}
	
	public static function fechaHumanaAMysql($fechaHumana) {
		$fecha = DateTime::createFromFormat('d/m/Y', $fechaHumana);
		if ($fecha)
			return $value = $fecha->format ( 'Y-m-d' );
		else
			return '';
	}
	
	public static function formatearNumero($numero, $numeroDecimales){
		if (is_numeric($numero))
			return number_format($numero, $numeroDecimales);
		else
			return 0;
	}
	
	
	public static function fechaHumanaSoloHora($fechaHumana){
		$fecha = DateTime::createFromFormat('d/m/Y H:i:j', $fechaHumana);
		if ($fecha) 	return $fecha->format('H:i');
		else			return '';
	}

	public static function fechaHumanaSoloFecha($fechaHumana){
		$fecha = DateTime::createFromFormat('d/m/Y H:i:j', $fechaHumana);
		if ($fecha)		return $fecha->format('d/m/Y');
		else 			return '';
	}
	
	/**
	 * Trasforma una fecha en formato Humano 31/12/2012 a fecha en formato mysql
	 * 2012-12-31
	 *
	 * @param string $fechaHumana
	 * @return string
	 */

	public static function fechaHumanaALarga($data) {
	
		// Parámetros: string $data: Fecha en formato dd/mm/aaaa o timestamp
		// int $tipus: Tipo de fecha (0-timestamp, 1-dd/mm/aaaa)
		// // Retorna: string Fecha en formato largo (x, dd mm de yyyy)
		if ($data != '') {
			$setmana = array (
					'Domingo',
					'Lunes',
					'Martes',
					'Miércoles',
					'Jueves',
					'Viernes',
					'Sábado'
			);
			$mes = array (
					'Enero',
					'Febrero',
					'Marzo',
					'Abril',
					'Mayo',
					'Junio',
					'Julio',
					'Agosto',
					'Septiembre',
					'Octubre',
					'Noviembre',
					'Diciembre'
			);
				
			$data = explode ( '/', $data );
			$data = mktime ( 0, 0, 0, $data [1], $data [0], $data [2] );
			// $setmana [date ( 'w', $data )] . ', ' . date ( 'd', $data ) . ' '
			// . $mes [date ( 'm', $data ) - 1] . ' de ' . date ( 'Y', $data );
			return $mes [date ( 'm', $data ) - 1] . ' de ' . date ( 'Y', $data );
		} else {
			return 0;
		}
	}
	

	public static function fechaSumarTiempo($numero, $periodo, $fecha){
		$fecha = self::fechaHumanaAMysql($fecha);
		switch ($periodo){
			case self::FECHA_MES:
				$periodo = 'month';
				break;
			case self::FECHA_DIA:
				$periodo = 'day';
				break;
		}
		$f = strtotime('+'.$numero.' '.$periodo, strtotime($fecha));
		return date('d/m/Y',$f);
	}

	
	public static function fechaRestarTiempo($numero, $periodo, $fecha){
		$fecha = self::fechaHumanaAMysql($fecha);
		switch ($periodo){
			case self::FECHA_MES:
				$periodo = 'month';
				break;
			case self::FECHA_DIA:
				$periodo = 'day';
				break;
		}
		$f = strtotime('-'.$numero.' '.$periodo, strtotime($fecha));
		return date('d/m/Y',$f);
	}
	
	
	public static function generar_clave($longitud) {
		$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		$string = '';
	
		for($p = 0; $p < $longitud; $p ++) {
			$string .= $characters [mt_rand ( 0, strlen ( $characters ) - 1 )];
		}
	
		return $string;
	}
	
	public static function generaToken($size) {
		$letters = explode ( ',', 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9' );
		$salida = '';
		for($i = 0; $i < $size; $i ++) {
			$salida .= array_rand ( $letters );
		}
		return $salida;
	}
	
	
}