<?php

/*******************************************************************************\
 * BIODIV, plugin et squelette pour SPIP - https://www.spip.net/               *
 *         dédié à la gestion d'observations naturalistes                      *
 *                                                                             *
 *         Copyright (C) 2008-2020 Renaud LAURETTE                             *
 *                                                                             *
 * BIODIV a été développé initialement pour le projet Biodiv.Balma de l'APCVEB *
 * (Association de Protection du Cadre de Vie et de l'Environnement balmanais) * 
 *     voir Biodiv.Balma : https://balma.biodiv.fr/                            *
 *     voir APCVEB : http://apcveb.free.fr/                                    *
 *                                                                             *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.         *
 *  Pour plus de détails voir les fichier COPYING.txt et LICENCE-BIODIV.md     *
\*******************************************************************************/

include_spip("inc/autoriser");
include_spip("inc/ordres_biodiv");


function formulaires_ordonner_biodiv_charger_dist() {

	// Initialisation du formulaire
	$valeurs = array();
	// verifier les droits
	if(!autoriser('ordonner')) {
		$valeurs['editable'] = false;
		return $valeurs;
	}
	
	return $valeurs;
}



function formulaires_ordonner_biodiv_verifier_dist() 
{
	$erreurs = array();
			
	// vérifier le fichier transmis
	if (isset($_FILES['ordres']) AND $_FILES['ordres']['tmp_name']) {
		$doc=&$_FILES['ordres'];
		// Chargement DOM du XML
		$ordresXml = new DOMDocument();
		if(!$ordresXml->load(realpath($doc['tmp_name']))) {
			$erreurs['message_erreur'] = _T('biodiv:msg_echec_parse_xml');
		} else {
			// Reception et parsing xml ok - on transforme
			if($f=find_in_path("xsl/freemind4spip.xsl")) {
				// transfo XSL trouvée - on la charge comme XML
				$xslDoc = new DOMDocument();
				if($xslDoc->load(realpath($f))) {
					// Transformation
					$proc = new XSLTProcessor();
					$proc->importStylesheet($xslDoc);
					$out = $proc->transformToDoc($ordresXml);
					// sauvegarde du resultat dans un fichier temporaire
					$outfile = realpath(tempnam(_NOM_TEMPORAIRES_INACCESSIBLES,"order"));
					$out->save($outfile);
					// Remplacement du fichier chargé par le fichier calculé
					unlink($doc['tmp_name']);
					$doc['tmp_name'] = $outfile;
				} else {
					spip_log("Ordonner Biodiv : Verification - Echec chargement XSL", "biodiv."._LOG_INFO_IMPORTANTE);
					$erreurs['message_erreur'] = _T('biodiv:msg_echec_load_xsl');
				}
			} else {
				spip_log("Ordonner Biodiv : Verification - XSL absent", "biodiv."._LOG_INFO_IMPORTANTE);
				$erreurs['message_erreur'] = _T('biodiv:msg_no_xsl');
			}
		}
		
	} else {
		spip_log("Ordonner Biodiv : Verification - Echec chargement ordres freemind", "biodiv."._LOG_INFO_IMPORTANTE);
		$erreurs['message_erreur'] = _T('biodiv:msg_echec_telechargement');
	}
	return $erreurs;
}

// Fonction de traitement
// A ce stade, le fichier $_FILES['ordres'] n'est plus le fichier téléchargé, mais le
// résultat de la transformation XSL : c'est devenu un fichier d'ordres précis à traiter.
// Ces ordres vont être traités un par un via SimpleXML

function formulaires_ordonner_biodiv_traiter_dist() {
	spip_log("Ordonner Biodiv :  Traitement - DEBUT", "biodiv");
	$resultat = array();
	$doc=&$_FILES['ordres'];
	$ordresXml = simplexml_load_file($doc['tmp_name']);
	$numOrdre=0;	// Rang de l'ordre dans le fichier
	$avancement="";	// Description des instructions exécutées
	
	foreach($ordresXml->lier as $lier) {
		// Traitement des ordres destinés à lier deux objets
		// Préparation de la description de l'ordre
		$numOrdre++; $avx='';
		foreach($lier->attributes() as $key => $value) { $avx .= ' '.$key.'='.$value; }
		$avancement .= $numOrdre . ": ". _T('biodiv:action_lier') . " $avx ";
		// On parse l'ordre pour créer une structure exécutable, et on déclenche l'exécution
		$ordre = ordreLier($lier);
		// On examine le statut retourné par l'exécution
		if($ordre['pret']) {
			// Succès : on enregistre le statut et on continue
			$avancement .= ' : ok<br/>';
			$resultat['message_ok'] = $avancement;
		} else {
			// Echec : on enregistre le statut et on interrompt
			$avancement .= ' : '. _T('biodiv:echec') .' : ' . $ordre['erreur'] . '<br/>' . _T('biodiv:traitement_interrompu');
			$resultat['message_erreur'] = $avancement;
			return $resultat;
		}
	}
	
	foreach($ordresXml->creer as $creer) {
		// TRaitement des ordres de création
		// Préparation de la description de l'ordre
		$numOrdre++; $avx='';
		foreach($creer->attributes() as $key => $value) { $avx .= ' '.$key.'='.$value; }
		$avancement .= $numOrdre . ": ". _T('biodiv:action_creer') . " $avx ";
		// Préparation de l'ordre et exécution
		$ordre = ordreCreer($creer);
		// Traitement du code retour
		if($ordre['pret']) {
			// Succès de l'ordre créer - on enregistre le statut
			$self = $ordre['id'];
			$avancement .= " : ok id=$self<br/>";		
			$resultat['message_ok'] = $avancement;
			// Un ordre "créer" peut contenir des sous-ordres "lier" qui se réfèrent à "self"
			// Le "self" correspond à l'objet qui vient d'être créé.
			foreach($creer->lier as $lier) {
				// On parcourt les sous-ordres "lier"
				$numOrdre++; $avx='';
				foreach($lier->attributes() as $key => $value) { $avx .= ' '.$key.'='.$value; }
				$avancement .= $numOrdre . ": Lier $avx ";
				// Préparation de l'ordre et exécution
				$ordre = ordreLier($lier,$self);
				// Traitement du code retour
				if($ordre['pret']) {
					// Succès du sous-ordre "lier": on enregistre le statut et on continue
					$avancement .= ' : ok<br/>';
					$resultat['message_ok'] = $avancement;
				} else {
					// Echec du sous-ordre "lier": on enregistre le statut et on interrompt
					$avancement .= ' : '. _T('biodiv:echec') .' : ' . $ordre['erreur'] . '<br/>' . _T('biodiv:traitement_interrompu');
					$resultat['message_erreur'] = $avancement;
					return $resultat;
				}
			} // fin des sous-ordres "lier"
		} else {
			// Echec de l'ordre créer : on enregistre le statut et on interrompt
			$avancement .= ' : '. _T('biodiv:echec') .' : ' . $ordre['erreur'] . '<br/>' . _T('biodiv:traitement_interrompu');
			$resultat['message_erreur'] = $avancement;
			return $resultat;
		}	
	}
	
	// D'autres ordres éventuels devraient être insérés ici
	
	// Tout est fini
	// On détruit le fichier temporaire des ordres et on retourne le résultat
	$avancement.='<br/><b>' . _T('biodiv:msg_succes_ordonner',array('qty'=>$numOrdre)) . '</b><br/>';
	$resultat['message_ok'] = $avancement;
	unlink($doc['tmp_name']);
	return $resultat;
}



?>
