<?php
/**
 * Cache - Gère le cache des variables
 * @package Cache
 * @author Michael RICOIS
 * @copyright Scores&Decisions
 */

/*
Dans une page, on définit des blocs
Pour chaque bloc enregistrement d'un fichier (nom de la page avec paramètres)
	Nom du bloc = tableau sérialisé des variables
	...

Dans le tableau sérialisé
	Nom de la valeur utile => valeur
	...

	Suppression des valeurs inutiles

*/

define('CACHE_MAXTIME', 2); //HEURES MAXIMUM EN CACHE
define('CACHE_REFRESH_HOUR', 14); //Heure de rafraichissement des pages
define('CACHE_EXT','.tpl');

/**
 * Retourne le chemin du fichier avec son extension
 * Si en argument une chaine de caractère est envoyé alors on définit que c'est le nom du fichier
 * Sinon le nom du fichier est enregistré en mémoire pour chaque appel
 * @return string
 */
function cache_filename()
{
	static $filename;
	$numargs = func_num_args();
	if($numargs != 0){
		//unset($filename);
		//static $filename;
		$args = func_get_args();
		$filename = PATH_SITE.'/cache/pages/'.$args[0].CACHE_EXT;
	}
	return $filename;
}

/**
 * Enregistre les données d'un bloc dans le cache
 * @param string $block
 * 	Le nom du bloc
 * @param array $array
 * 	Le tableau de données (clé => valeur) à stocker sous forme sérialisé
 * @return boolean
 */
function cache_add($block, $array){
	//Traitement
	$array = cache_htmlencode($array);
	//Ajout des blocs sérialisés
	$file = cache_filename();
	if($file != ''){
		$data = $block.' = '.serialize($array);
		if( cache_writefile($file,$data) !== FALSE ) return TRUE;
		else return FALSE;
	}else return FALSE;
}

/**
 * Récupére les variables en cache depuis le fichier.
 * @return array ou FALSE
 */
function cache_get($block){
	global $firephp;
	$file = cache_filename();
	$cache = cache_readfile($file);
	if(isset($cache[$block])){
		//Traitement
		$block = unserialize($cache[$block]);
		$block = cache_htmldecode($block);
		return $block;
	}else return FALSE;
}

/**
 * Suppression du cache pour la page en cours.
 * @return boolean
 */
function cache_delete(){
	$file = cache_filename();
	if(file_exists($file)) return unlink($file);
	else return FALSE;
}

/**
 * Vérifie que le fichier est disponible dans le cache
 * @param $file
 * 	Chemin vers le fichier que l'on veut vérifier
 * @return boolean
 * 	Retourne TRUE ou FALSE
 */
function cache_exist(){
	$file = cache_filename();
	if( file_exists($file) && !cache_timeover($file) ) return TRUE;
	else return FALSE;
}
/**
 * Vérifie si la date de création du fichier de cache est toujours valide
 * @param $file
 * 	Chemin vers le fichier que l'on veut vérifier
 * @return boolean
 * 	Retourne TRUE or FALSE
 */
function cache_timeover($file){
	$dateFile = filemtime($file);
	$now = mktime(date('G'), date('i'), date('s'), date("m") , date("d"), date("Y"));
	$maxTime = mktime(date('G',$dateFile)+CACHE_MAXTIME, date('i',$dateFile), date('s',$dateFile), date("m",$dateFile), date("d",$dateFile), date("Y",$dateFile));
	$refreshHour = mktime(CACHE_REFRESH_HOUR, 0, 0, date("m"), date("d"), date("Y"));
	if( ($now>$maxTime) || ($dateFile<$refreshHour && $now>$refreshHour) ) return TRUE;
	else return FALSE;
}

/**
 * Ecrit une ligne dans un fichier
 * @param $file
 * 	Le chemin du ficher à écrire
 * @param $line
 * 	Une chaîne de caractère
 * @return boolean ou le nombre d'octet écrit
 */
function cache_writefile($file, $line){
	$fp = fopen($file,'a');
	$result = fwrite($fp,$line."\n");
	fclose($fp);
	return $result;
}

/**
 * Lit le fichier de cache ligne par ligne
 * @param $file
 * 	Chemin du fichier à lire
 * @return array
 * 	Retourne un tableau de valeur ou FALSE si le fichier n'a pu être trouvé
 */
function cache_readfile($file){
	global $firephp;
	static $cache_loaded = FALSE;
	static $file_loaded;
	static $cache = array();
	if ( ($file!=$file_loaded) ) {
		$file_loaded = $file;
		if (is_file($file)) {
			$lines = file($file);
			foreach ($lines as $line_num => $line) {
				list($key, $value) = explode(' = ', $line, 2);
				$cache[$key] = $value;
			}
		}
		$cache_loaded = TRUE;
	}
	return $cache;
}

function cache_graph($filename){
	if( hasModeEdition() ){
		return false;
	} elseif ( file_exists($filename) && !cache_timeover($filename) ) {
		return true;
	} else {
		return false;
	}
}

function cache_htmldecode($value){
	$value = is_array($value) ? array_map('cache_htmldecode', $value) : base64_decode($value);
	return $value;
}

function cache_htmlencode($value){
	$value = is_array($value) ? array_map('cache_htmlencode', $value) : base64_encode($value);
	return $value;
}

?>