<?php
/**
 * Define a exportmodel.
 * @author Valentin MORREEL
 * @category Plugin
 * @license copyright
 */
class ExportModel extends Entity{
	public $id,$label,$description,$plugin,$dataset,$filename,$privacy,$export_format;
	protected $TABLE_NAME = 'export_model';
	public $fields =
	array(
		'id' => 'key',
		'label' => 'string',
		'description' => 'longstring',
		'plugin' => 'string',
		'dataset' => 'string',
		'filename' => 'string',
		'privacy' => 'string',
		'export_format' => 'string'
	);

	const PRIVACY_PRIVATE = 'private';
	const PRIVACY_PUBLIC = 'public';

	public function privacy(){
		return $this->privacy==self::PRIVACY_PRIVATE?'Privé':'Public';
	}

	//Renvoie les infos des documents placés en dropzone
	public function documents(){
		$documents = array();
		foreach(glob(__ROOT__.FILE_PATH.'export'.SLASH.'documents'.SLASH.$this->plugin.SLASH.$this->id.SLASH.'*.*') as $file){
			if(is_dir($file)) continue;
			$filenameDisk = $file;
			// $filenameDisk = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? html_decode_utf8($file) : $file;
			if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $file = utf8_encode($file);
			$documents[] = array(
				'path' => 'export'.SLASH.'documents'.SLASH.$this->plugin.SLASH.$this->id.SLASH.basename($file),
				'url' => 'action.php?action=export_exportmodel_download_document&path='.$this->plugin.SLASH.$this->id.SLASH.rawurlencode(basename($file)),
				'name' => basename($file),
				'icon' => getExtIcon(getExt($file)),
				'lastModification' => ' - '.date('d/m/Y', filemtime($filenameDisk))
			);
		}
		return $documents;
	}

	public static function get_standard_dataset($parameters){
		global $myUser, $myFirm;
		if(isset($parameters['description']) && $parameters['description']!=true){
			//Common DS
			$data['programme.date.compact'] = date('d/m/Y');
			setlocale (LC_TIME, 'fr_FR.utf8','fra');
			$data['programme.date.littéral'] = utf8_encode(strftime('%d %B %Y'));
			$data['programme.heure'] = date('H:i');
			$data['utilisateur.photo'] = '::'.$myUser->getAvatar(true);
			$data['utilisateur.identifiant'] = $myUser->login;
			$data['utilisateur.prénom'] = $myUser->firstname;
			$data['utilisateur.nom'] = $myUser->name;
			$data['utilisateur.fonction'] = $myUser->function;
			$data['utilisateur.email'] = $myUser->mail;
			
			$data['établissement.logo'] = '::'.$myFirm->logo('path');
			$data['établissement.libellé'] = $myFirm->label;
			$data['établissement.téléphone'] = $myFirm->phone;
			$data['établissement.fax'] = $myFirm->fax;
			$data['établissement.adresse.rue'] = $myFirm->street;
			$data['établissement.adresse.complément'] = $myFirm->street2;
			$data['établissement.adresse.ville'] = $myFirm->city;
			$data['établissement.adresse.cp'] = $myFirm->zipcode;
			$data['établissement.email'] = $myFirm->mail;
			$data['établissement.siret'] = $myFirm->siret;
		} else {
			//Common DS
			$data['programme.date.compact'] = 'Date courante (format "dd/mm/YYYY")';
			$data['programme.date.littéral'] = 'Date courante (format "01 Janvier 1970")';
			$data['programme.heure'] = 'Heure courante (format hh:mm)';
			$data['utilisateur.photo'] = array('desc'=>'Photo de profil de l\'utilisateur courant', 'type'=>'photo');
			$data['utilisateur.identifiant'] = 'Identifiant de l\'utilisateur courant';
			$data['utilisateur.prénom'] = 'Prénom de l\'utilisateur courant';
			$data['utilisateur.nom'] = 'Nom de l\'utilisateur courant';
			$data['utilisateur.fonction'] = 'Fonction occupée par l\'utilisateur courant';
			$data['utilisateur.email'] = 'Adresse e-mail de l\'utilisateur courant';

			$data['établissement.logo'] = array('desc'=>'Le logo de l\'établissement courant', 'type'=>'photo');
			$data['établissement.libellé'] = 'Le libellé de l\'établissement courant';
			$data['établissement.téléphone'] = 'Le n° de téléphone de l\'établissement courant';
			$data['établissement.fax'] = 'Le n° de fax de l\'établissement courant';
			$data['établissement.adresse.rue'] = 'La rue de l\'établissement courant';
			$data['établissement.adresse.complément'] ='Le complément d\'adresse de l\'établissement courant';
			$data['établissement.adresse.ville'] ='La ville de l\'établissement courant';
			$data['établissement.adresse.cp'] = 'Le code postal de l\'établissement courant';
			$data['établissement.email'] = 'L\'adresse mail de l\'établissement courant';
			$data['établissement.siret'] = 'Le n° de SIRET de l\'établissement courant';
		}
		return $data;
	}

	//Renvoie les différents type de templates pris en compte
	public static function templates($key=null){
		$templates = array();
		foreach (glob(__DIR__.SLASH.'template'.SLASH.'*.class.php') as $templatePath) {
			require_once($templatePath);
			$className = str_replace('.class.php','',basename($templatePath));
			$infos = get_class_vars($className);
			$templates[$infos['extension']] = array('handler' => $className,'mime'=>$infos['mime'],'extension'=>$infos['extension'], 'description'=>$infos['description']);
		}

		if(!isset($key)) return $templates;
		return isset($templates[$key]) ? $templates[$key] : $templates['txt'];	
	}

	//Permet d'ajouter un jeu de données pour un plugin donné
	public static function add($plugin, $dataset, $label, $func){
		Plugin::addHook('export_model_data', function(&$datasets, $params) use ($plugin, $dataset, $label, $func){
			global $myUser;
			if(isset($params['plugin']) && $params['plugin'] != $plugin) return;
			if(isset($params['dataset']) && $params['dataset'] != $dataset) return;
			$datasets[$dataset] = array(
				'plugin' => $plugin,
				'dataset' => $dataset,
				'label' => $label,
				'function' => $func
			);
		});
	}

	//Récuperation de toutes les données (ou description) d'un dataset
	public static function dataset($plugin,$dataset,$parameters=array(),$description = null){
		
		$datasets = array();
	
		Plugin::callHook('export_model_data', array(
			&$datasets, array(
			'plugin' => $plugin,
			'dataset' => $dataset,
			'description' => true
		)));

		$current = reset($datasets);
		$current['values'] = array();
		//Merge des données génériques erp et des données du dataset
		$allDataset = array_merge(
			ExportModel::get_standard_dataset($parameters), 
			$current['function']($parameters)
		);

		foreach ($allDataset as $macro => $value) {
			$row = array();
			if(is_array($value)){
				$row['type'] = $value['type'];
				$row['desc'] = $value['desc'];
				if(isset($value['subitems']))
					$row['subitems'] = $value['subitems'];
			} else {
				$row['type'] = 'value';
				$row['desc'] = $value;
			}
			$current['values'][$macro] = $row;
		}
		return $current;
	}

	//Permet de fusionner le fichier d'export modèle et les données associées
	public static function merge_data_template(&$filename, $docInfos, $datas, $return = 'stream'){
		$document = $docInfos['document'];
		$ext = getExt($document['name']);
		$tplType = ExportModel::templates($docInfos['format']);
		$tplHandler = $tplType['handler'];

		//Gestion macros de nombre et macro dans le titre
		foreach($datas as $key => $value){
			if(is_array($value)){
				$datas[$key.'.nombre'] = count($value);
				continue;
			}
			$filename = str_replace('{{'.$key.'}}', $value, $filename);
		}
		$filename = preg_replace('#[\<\>\?\|\*\:\\\/\"\'\,]#i', '-', $filename);
		$filePath = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($document['path']) : $document['path'];

		return $tplHandler::from_template($filePath, $datas, $return);
	}
}
?>