<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Fichier UserManager.php
*
* Ce fichier contient la classe UserManager
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/06/05
* @version 0.3
* @package system_data
* @subpackage User
* @copyright Copyright &copy; 2009-2018, Rooty
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
* <p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Appel à la classe User...
*/
require ($CONF_LIB_PATH."lib/system/system_data/user/user.php");

/**
* Classe UserManager
*
* <p>Classe de gestion des instances de Users <br>
*   (permet de fabriquer, detruire, mettre à jour des objet Users)<br>
* Cette classe se sert des ressources à sa disposition (dans ./ressource)<br>
* Les Classes de ressource doivent avoir toutes les methodes correspondantes <br>
* aux methodes de la classe intitulés sourceXXX</p>
*
* <p>Est configuré dans data_acces.php : <br>
* - La Source d'information (Db)<br>
* l'objet ressource se sert lui-même des classes d'accés aux données(lib/data_source/...)<br>
* </p>
* @package system_data
* @subpackage User
*/
class UserManager extends Manager
{
	//
	// Constructor
	//

/**
* Constructeur de la classe UserManager PHP4
*
* <p>Initialise le bon objet (ressource) ... <br>chacun de ces objets doit avoir les mêmes methodes (equivalente aux methodes sourceXXX)</p>
* <p>L'objet UserManager ne doit servir qu'a la récuperation des User</p>
* @access public
*/
/**
* Constructeur de la classe UserManager PHP5
*
* @access public
*/
	function __construct()
	{
	}

###########################################################################
#### Méthodes abstraites
###########################################################################

/**
* checkIfUserExist: Vérifie si l'utilisateur existe à partir de son login
*
* <p>Retourne true ou false</p>
* @access public
* @param chaine login
* @abstract
* @return bolean true/false
*/
// 	function testLoadFromLogin($login)
// 	{
// 		return;
// 	}

/**
* doLoadFromId: Charge l'utilisateur depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @param entier
* @abstract
* @return tableau
*/
	function doLoadFromId($id)
	{
		return array();
	}

/**
* doLoadFromLogin: Charge l'utilisateur depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @param chaine login
* @abstract
* @return tableau
*/
	function doLoadFromLogin($login)
	{
		return array();
	}

/**
* doInsert: Insert l'utilisateur dans la BD
*
* <p>les param doivent être traités avec la classe chaine!</p>
* <P>Methode à surcharger dans les classes de resource</P>
* @param chaine titre de la personne
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine website
* @param chaine msn
* @param chaine jabber
* @param chaine facebook
* @param chaine mastodon
* @param chaine adresse
* @param chaine code postal
* @param chaine état
* @param chaine pays
* @param chaine telephone
* @param chaine fax
* @param tableau commentaires
* @param tableau informations
* @param entier chartestatus
* @param entier accountactive
* @access public
* @return entier
*/
	function doInsert($title, $firstName, $lastName, $login, $password, $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive)
	{
		return 0;
	}

/**
* doUpdate:Modifie l'utilisateur dans la BD
*
* <p>les param doivent être traités avec la classe chaine!</p>
* <P>Methode à surcharger dans les classes de resource</P>
* @param entier identifiant
* @param chaine titre de la personne
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine website
* @param chaine msn
* @param chaine jabber
* @param chaine facebook
* @param chaine mastodon
* @param chaine adresse
* @param chaine code postal
* @param chaine état
* @param chaine pays
* @param chaine telephone
* @param chaine fax
* @param tableau commentaires
* @param tableau informations
* @param entier chartestatus
* @param entier accountactive
* @abstract
* @access public
* @return entier
*/
	function doUpdate($id, $title, $firstName, $lastName, $login, $password, $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive)
	{
		return 0;
	}

/**
* doDelete : Detruit l'utilisateur dans la BD
*
* <P>Methode à surcharger dans les classes de resource</P>
* @param entier identifiant de l'utilisateur
* @access public
* @abstract
* @return booleen
*/
	function doDelete($id)
	{
		return true;
	}

/**
* doIsValid:Utilisateur Valide
*
* <P>les param doivent être traités avec la classe chaine</P>
* <P>Methode à surcharger dans les classes de resource</P>
* @param chaine login de l'utilisateur
* @param chaine password de l'utilisateur
* @access public
* @abstract
* @return booleen
*/
	function doIsValid($login, $password)
	{
		return true;
	}

###########################################################################
#### Methodes privee
###########################################################################


/**
* sourceLoadFromId: charge à partir d'un identifiant'
*
* <P>Permet le récupération des infos d'un objet utilisateur à partir de son identifiant</P>
* <P>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* <br><br>
* Le tableau est formaté de la maniére suivant tab["nom_du_champ"]=valeur_du_champ</P>
* @access public
* @return tableau
*/
	function sourceLoadFromLogin($login)
	{
		global $SYSTEM_KEY;
		$ObjLogin		=new Chaine($login);
		$tab=$this->doLoadFromLogin($ObjLogin->StrToSql());
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (is_array($tab))
		{
			if (!Is_numeric($tab["id"]))
			{
				return false;
			}


// 			$tableau=(Isset($tab["comment"])?$tab["comment"]:array());
// 			for ($i=0;$i<count($tableau);$i++)
// 			{
// 				$tableau[$i]=stripslashes($tab["comment"][$i]);
// 			}
// 			$tab["comment"]=$tableau;
// 
// 			$tableau=(Isset($tab["info"])?$tab["info"]:array());
// 			for ($i=0;$i<count($tableau);$i++)
// 			{
// 				$tableau[$i]=stripslashes($tab["info"][$i]);
// 			}
// 			$tab["info"]=$tableau;

		}else{
			return false;
		}
		return $tab;
	}


/**
* sourceLoadFromId: charge à partir d'un identifiant'
*
* <P>Permet le récupération des infos d'un objet utilisateur à partir de son identifiant</P>
* <P>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* <br><br>
* Le tableau est formaté de la maniére suivant tab["nom_du_champ"]=valeur_du_champ</P>
* @access public
* @return tableau
*/
	function sourceLoadFromId($id)
	{
		global $SYSTEM_KEY;

		$tab=$this->doLoadFromId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (is_array($tab))
		{
			if (!Is_numeric($tab["id"]))
			{
				/* Erreur */
				$systemError=1;
				$classe="user";
				$message="Erreur dans UserManager";
				addError($systemError,$classe,$message, __line__, __file__);
				return array();
			}

// 			$tableau=(Isset($tab["comment"])?$tab["comment"]:array());
// 			for ($i=0;$i<count($tableau);$i++)
// 			{
// 				$tableau[$i]=stripslashes($tab["comment"][$i]);
// 			}
// 			$tab["comment"]=$tableau;
// 
// 			$tableau=(Isset($tab["info"])?$tab["info"]:array());
// 			for ($i=0;$i<count($tableau);$i++)
// 			{
// 				$tableau[$i]=stripslashes($tab["info"][$i]);
// 			}
// 			$tab["info"]=$tableau;

		}else{
			/* Erreur */
			$systemError=1;
			$classe="user";
			$message="Erreur dans UserManager";
			addError($systemError,$classe,$message, __line__, __file__);
		}
		return $tab;
	}

/**
* sourceInsert: Insert un utilisateur
*
* <P>Insertion de l'objet Utilisateur dans la source de données<br>
* indifférement du type de cette source</P>
* <P>Retourne L'identifiant de l'objet insérer<br></P>
*
* @param chaine titre de la personne
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine website
* @param chaine msn
* @param chaine jabber
* @param chaine facebook
* @param chaine mastodon
* @param chaine adresse
* @param chaine code postal
* @param chaine état
* @param chaine pays
* @param chaine telephone
* @param chaine fax
* @param tableau commentaires
* @param tableau informations
* @param entier chartestatus
* @param entier accountactive
* @access public
* @return entier
*/
	function sourceInsert($title, $firstName, $lastName, $login, $password, $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive)
	{
		global $SYSTEM_KEY;

		$ObjPassd		=new Chaine($password);

		$identifiant=$this->doInsert( $title, $firstName, $lastName, $login, $ObjPassd->Encrypt($SYSTEM_KEY), $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive);

		return $identifiant;
	}

/**
* sourceUpdate: Met à jour l'utilisateur
*
* <P>Mise à jour de l'objet indifferemment de la source de données</P>
* <p>Retourne L'identifiant de l'objet insérer<br>
* <br></P>
*
* @param entier identifiant
* @param chaine titre de la personne
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine website
* @param chaine msn
* @param chaine jabber
* @param chaine facebook
* @param chaine mastodon
* @param chaine adresse
* @param chaine code postal
* @param chaine état
* @param chaine pays
* @param chaine telephone
* @param chaine fax
*
* @param tableau commentaires
* @param tableau informations
* @param entier chartestatus
* @param entier accountactive
*
* @access public
* @return booleen
*/
	function sourceUpdate($id, $title, $firstName, $lastName, $login, $password, $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive)
	{
		global $SYSTEM_KEY;

		if (!Is_numeric($id))
		{
			/* Erreur */
			$systemError=1;
			$classe="user";
			$message="Erreur dans UserManager";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}

		$ObjPassd		=new Chaine($password);

		return $this->doUpdate($id, $title, $firstName, $lastName, $login, $ObjPassd->Encrypt($SYSTEM_KEY), $mail, $birthDate, $website, $msn, $jabber, $facebook, $mastodon, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info, $charteStatus, $accountActive);
	}

/**
* sourceDelete : Detruit l'utilisateur
*
*<P>Suppression de l'objet à partir de son identifiant</P>
*
* @param entier identifiant de l'utilisateur
* @access public
* @return booleen
*/
	function sourceDelete($id)
	{
		return $this->doDelete($id);
	}

/**
* checkValid : Utilisateur Valide
*
* @param chaine login de l'utilisateur
* @param chaine password de l'utilisateur
* @access public
* @return booleen
*/
	function checkValid($login, $password)
	{
		global $SYSTEM_KEY;

		$ObjPassd		=new Chaine($password);

		return $this->doCheckValid($login, $ObjPassd->Encrypt($SYSTEM_KEY) );
	}
	
	function checkAccountActive($id)
	{
		return $this->doCheckAccountActive($id);
	}

/**
* checkValid : Utilisateur Valide
*
* @param chaine login de l'utilisateur
* @param chaine password de l'utilisateur
* @access public
* @return booleen
*/
	function checkValidUserId($id)
	{
		return $this->doCheckValidUserId($id);
	}

/**
* checkLoginExist : Login existant
*
* @param chaine login de l'utilisateur
* @access public
* @return booleen
*/
	function checkLoginExist($login)
	{
		return $this->doCheckLoginExist($login);
	}

###########################################################################
#### Methodes public
###########################################################################

/**
* createNewInstance : créer un objet vierge
*
* @access public
* @return object
*/
	function createNewInstance()
	{
		return new User();
	}

/**
* createInstanceFromLogin : récupere l'objet avec le login du compte
* @param entier login
* @access public
* @return object retourne un objet de type User ou false
*/
	function createInstanceFromLogin($login)
	{

		global $SYSTEM_KEY;

		$return = new User();

			/* Récupération des infos */
			$tab=$this->sourceLoadFromLogin($login);
			if (is_array($tab) && isset($tab["id"]) && is_numeric($tab["id"]))
			{
				/* création et alimentation de l'objet */
				$ObjPassd		=new Chaine($tab["password"]);
				$return->doLoad($tab["id"], $tab["title"], $tab["firstName"], $tab["lastName"], $tab["login"], $ObjPassd->Decrypt($SYSTEM_KEY), $tab["mail"], $tab["birthDate"], $tab["website"], $tab["msn"], $tab["jabber"], $tab["facebook"], $tab["mastodon"], $tab["postalAddress"], $tab["postalCode"], $tab["city"], $tab["state"], $tab["country"], $tab["organisation"], $tab["tel"], $tab["fax"], $tab["comment"], $tab["info"], $tab["charteStatus"], $tab["accountActive"]);
			}else{
				$return = false;
			}
		return $return;
	}

/**
* createInstance : récupere l'objet avec l'identifiant $id
* @param entier identifiant de l'association User
* @access public
* @return object retourne un objet de type User
*/
	function createInstance($id)
	{
		global $SYSTEM_KEY;

		$return = new User();
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromId($id);
			if (is_array($tab) && isset($tab["id"]) && is_numeric($tab["id"]))
			{
				/* création et alimentation de l'objet */
				$ObjPassd		=new Chaine($tab["password"]);
				$return->doLoad($tab["id"], $tab["title"], $tab["firstName"], $tab["lastName"], $tab["login"], $ObjPassd->Decrypt($SYSTEM_KEY), $tab["mail"], $tab["birthDate"], $tab["website"], $tab["msn"], $tab["jabber"], $tab["facebook"], $tab["mastodon"], $tab["postalAddress"], $tab["postalCode"], $tab["city"], $tab["state"], $tab["country"], $tab["organisation"], $tab["tel"], $tab["fax"], $tab["comment"], $tab["info"], $tab["charteStatus"], $tab["accountActive"]);
			}else{
				$systemError=3;
				$classe="UserManager";
				$message="Erreur id inexistant ".$id;
				addError($systemError, $classe, $message, __line__, __file__);
			}
		}else{
			$systemError=3;
			$classe="UserManager";
			$message="Erreur id invalide ".$id;
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}

/**
* deleteInstance : detruit l'objet physique
* @param object objet User à effacer
* @access public
* @return object objet Langue mis à jour
*/
	function deleteInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="user") )
		{
			if($obj->isLoaded()==true)
			{
				/* Récupération des infos */
				$this->CallSystemPlugin("__deleteUser", $obj);
				$return=$this->sourceDelete($obj->getId());
				$obj->setId(0);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="UserManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);
		return $obj;
	}

/**
* updateInstance : met à jour l'objet
* @param object objet User à modifier
* @access public
* @return object objetUser mis à jour
*/
	function updateInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="user") && ($obj->isLoaded()==true))
		{
			/* Récupération des infos */
			$id=$this->sourceUpdate($obj->getId(), $obj->getTitle(), $obj->getFirstName(), $obj->getLastName(), $obj->getLogin(), $obj->getPassword(), $obj->getMail(), $obj->getBirthDate(), $obj->getWebSite(), $obj->getMsn(), $obj->getJabber(), $obj->getFacebook(), $obj->getMastodon(), $obj->getPostalAddress(), $obj->getPostalCode(), $obj->getCity(),  $obj->getState(), $obj->getCountry(), $obj->getOrganisation(), $obj->getTel(), $obj->getFax(), $obj->getComment(), $obj->getInfo(), $obj->getCharteStatus(), $obj->getAccountActive());
			$this->CallSystemPlugin("__updateUser", $obj);
			return $obj;
		}
		/* Erreur */
		$systemError=3;
		$classe="UserManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* insertInstance : créer enregistre l'objet
*<p>affecte l'id de l'objet si nécessaire</p>
* @param object objet Langue à inserer
* @access public
* @return object objet Langue mis à jour
*/
	function insertInstance($obj)
	{
		if ((strtolower(get_class($obj))=="user"))
		{
			if ($obj->isLoaded()==false)
			{
				/* Récupération des infos */
				$id=$this->sourceInsert($obj->getTitle(), $obj->getFirstName(), $obj->getLastName(), $obj->getLogin(), $obj->getPassword(), $obj->getMail(), $obj->getBirthDate(), $obj->getWebSite(), $obj->getMsn(), $obj->getJabber(), $obj->getFacebook(), $obj->getMastodon(), $obj->getPostalAddress(), $obj->getPostalCode(), $obj->getCity(),  $obj->getState(),  $obj->getCountry(),  $obj->getOrganisation(),  $obj->getTel(),  $obj->getFax(),  $obj->getComment(),  $obj->getInfo(), $obj->getCharteStatus(), $obj->getAccountActive());
				$obj->setId($id);
				$this->CallSystemPlugin("__insertUser", $obj);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="UserManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* saveInstance : créer enregistre l'objet
* @param object objet User à sauvegarder
* @access public
* @return object objet Langue mis à jour
*/
	function saveInstance($obj)
	{
		if ((strtolower(get_class($obj))=="user"))
		{
			if ($obj->isLoaded()==false)
			{
				$return=$this->insertInstance($obj);
			}else{
				$return=$this->updateInstance($obj);
			}
			return $return;
		}
		/* Erreur */
		$systemError=3;
		$classe="UserManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);
		$return=$obj;
		return $return;
	}

/**
* updateCharteStatus : Met à jour le status de la charte
* @access public
* @return true/false
*/
	function updateCharteStatus($userId)
	{
		$this->doUpdateCharteStatus($userId);
// 		$this->updateInstance($GLOBALS["SYSTEM_USER_SESSION"]->user);
// 		var_dump($GLOBALS["SYSTEM_USER_SESSION"]->user);
		
	}

/**
* updateAccountActive : Met à jour le statut du compte (Actif ou pas)
* @access public
* @return true/false
*/
	function updateAccountActive($userId)
	{
		$this->doUpdateAccountActive($userId);
// 		$this->updateInstance($GLOBALS["SYSTEM_USER_SESSION"]->user);
// 		var_dump($GLOBALS["SYSTEM_USER_SESSION"]->user);
		
	}
}
?>
