<?php

/**
 * Module qui gère les salles
 * 
 * @author Olivier Arteau
 */

class Salles implements Module {
	private $resultat = array();
	
    public 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;
    	}
    	
    	// Vérification commune //
    	$utilisateur = Session::getUtilisateurCourrant();
    	
		if ($utilisateur == null) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Utilisateur non connecté'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Utilisateur non connecté');
    		$status->cancel();
    		
    		return $status;
		}
    	
    	switch ($param['cmd']) {
    		case 'join' :
    			return $this->commandeJoin($param, $status);
    		case 'quit' :
    			return $this->commandeQuit($param, $status);
    		case 'getlistesalles' :
    			return $this->commandeListeSalle($param, $status);
    		case 'getutilisateurinsalle' :
    			return $this->commandeListeUtilisateur($param, $status);
    	}
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeJoin(array $param, StatusObject $status) {
    	if (!isset($param['salle'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$utilisateur = Session::getUtilisateurCourrant();
    	
    	$param['password'] = (isset($param['password'])) ? $param['password'] : '';
    	try {
    		$salle = new Salle($param['salle'], true);
    	} catch(Exception $e) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => $e->getMessage()
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage($e->getMessage());
    		$status->cancel();
    		
    		return $status;
    	}
    	$passwd = $salle->getPassword();
    	
    	if ($passwd != '' && $passwd != Encryption::encrypter($param['password'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Mot de passe requis'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Mot de passe requis');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	if ($utilisateur->isInRoom($param['salle'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous êtes déjà dans cette salle'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous êtes déjà dans cette salle');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'Ajouter à la salle'
    	);
  		
  		return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeQuit(array $param, StatusObject $status) {
    	if (!isset($param['salle'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$utilisateur = Session::getUtilisateurCourrant();
    	
    	if (!$utilisateur->isInRoom($param['salle'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous n\'êtes pas dans la salle.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous n\'êtes pas dans la salle.');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'Vous avez quitté la salle avec succès'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeListeUtilisateur (array $param, StatusObject $status) {
    	$utilisateur = Session::getUtilisateurCourrant();
		
		// On retourne la liste des utilisateurs pour chacune des salles que l'utilisateur est connecté //
		$lstSalle = $utilisateur->getSallesConnectes();
		$bd = BDConnexion::getBDConnexion();
		$sql =
			'SELECT u.nom AS utilisateur, s.nom AS salle, u.flags ' .
			'FROM occupation o ' .
			'INNER JOIN utilisateurs u ON o.utilisateurID=u.id ' .
			'INNER JOIN salles s ON s.id=o.salleID WHERE u.lastping>? AND (';
		$parametre = array(time() - PING_TIMEOUT);
		
		for ($i=0,$limit=count($lstSalle); $i<$limit; $i++){
			if ($i!=0) {
				$sql .= ' OR ';
			}
			
			$sql .= 'o.salleID=?';
			array_push($parametre, $lstSalle[$i]->getID());
    	}
    	$sql .= ')';
    	$donnee = $bd->execQuerySelect($sql, $parametre);
    	
    	$resultat = array();
    	for ($i=0, $limit=count($donnee); $i<$limit; $i++) {
    		if (!isset($resultat[$donnee[$i]['salle']]))
    			$resultat[$donnee[$i]['salle']] = array();
    		array_push($resultat[$donnee[$i]['salle']], array(
    			'nom' => $donnee[$i]['utilisateur'],
    			'flags' => $donnee[$i]['flags']
    		));
    	} 
    	
		$this->resultat = $resultat;
		return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeListeSalle(array $param, StatusObject $status) {
    	$db = BDConnexion::getBdConnexion();
    	$sql = 'SELECT s.nom, COUNT(DISTINCT u.id) AS nbUtilisateur ' .
    		   'FROM salles s INNER JOIN occupation o ON o.salleID=s.id INNER JOIN utilisateurs u ON u.id=o.utilisateurID ' .
			   'WHERE u.lastping>? GROUP BY o.salleID';
		$param = array(time() - PING_TIMEOUT);
    	$resultat = $db->execQuerySelect($sql, $param);
    	$this->resultat = $resultat;
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    public function getCommandesEnregistre() {
    	return array('join', 'quit', 'getlistesalles', 'getutilisateurinsalle');
    }
    
    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) {
   		if ((get_class($status) == 'CommandStatus' && !$status->isCancel()) || $status == PAFServer::$NO_ACTION_TAKEN) {
   			switch ($param['cmd']) {
   				case 'join' : 
   					$salle = new Salle($param['salle']);
   					$salle->joinRoom(Session::getUtilisateurCourrant());
   					$this->resultat['salle'] = $salle->getNom();
   					break;
   				case 'quit' :
   					$salle = new Salle($param['salle']);
   					$salle->leaveRoom(Session::getUtilisateurCourrant());
   					break;
   			}
   		}
   		
   		JSONOutput::output($this->resultat);
   	}
}

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