<?php

/**
 * Module qui gère le login
 * 
 * @author Olivier Arteau
 */

class Login implements Module{
	private $resultat = array();
	
    function __construct() {
    }
    
    public function executerCommande(array $param, StatusObject $status) {
    	// Si l'événement est cancellé //
    	if (get_class($status) == 'CommandStatus' && $status->isCancel()) {
    		$this->onStatusChange($param, $status);
    		return PAFServer::$NO_ACTION_TAKEN;
    	}
    	
    	// Si l'utilisateur est déjà connecté //
    	$utilisateur = Session::getUtilisateurCourrant();
    	
    	if ($utilisateur != null && $utilisateur->getLastPing() > (time() - PING_TIMEOUT)) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous êtes déjà connecté'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous êtes déjà connecté');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// Si le paramètre username est manquant ou incorrect //
    	$filter = array(
			'username' => '{EN_Alphabet+Number+"_"}'
		);
    	if (!FormControl::checkForm($param, $filter)) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou incorrect. Seule les lettres majuscule, les nombres et les _ sont acceptés.'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant ou incorrect. Seule les lettres majuscule, les nombres et les _ sont acceptés.');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// Vérification à savoir si un utilisateur utilise déjà le nom en question //
    	$bd = BDConnexion::getBdConnexion();
    	$sql = 'SELECT nom FROM utilisateurs WHERE nom LIKE ? AND lastping>?';
    	$parametres = array($param['username'], time() - PING_TIMEOUT);
    	$resultat = $bd->execQuerySelect($sql, $parametres);
    	
    	if (isset($resultat[0])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Nom d\'utilisateur déjà utilisé'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Nom d\'utilisateur déjà utilisé');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// Confirme temporairement que tout est correct //
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'Connexion avec succès'
    	);
    	
    	// Avant de créer une nouvelle connexion on supprime l'ancienne //
    	Session::detruire();
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    public function getCommandesEnregistre() {
    	return array('login');
    }
    
   	public function onStatusChange(array $param, StatusObject $status) {
   		if (get_class($status) == 'CommandStatus' && $status->isCancel()) {
   			$this->resultat = array(
	    		'resultat' => 'false',
	    		'message' => $status->toString()
	    	);
   		}
   	}
   	
   	public function finalize(array $param, StatusObject $status) {
   		// Si la commande n'a pas été cancellé on procède //
   		if ((get_class($status) == 'CommandStatus' && !$status->isCancel()) || $status == PAFServer::$NO_ACTION_TAKEN) {
	   		// Connecte l'utilisateur //
	    	$bd = BDConnexion::getBDConnexion();
	    	$sql = 'INSERT INTO utilisateurs (`nom`,`flags`,`lastping`) VALUES (?,?,?)';
	    	$parametre = array($param['username'], '', time());
	    	$bd->execQuery($sql, $parametre);
	    	
	    	// Initialisation des variables de sessions //
	    	Session::setValeur('username', $param['username']);
	    	Session::setValeur('id', $bd->getLastInsertId());
	    	Session::setValeur('lastping', time());
   		}
   		
   		JSONOutput::output($this->resultat);
   	}
}

PAFServer::getInstance()->enregistrerModule(new Login());
?>