<?php
define('FLAG_REGISTER', 'r');

/**
 * Module qui gère les usages enregistrés.
 * 
 * @author Olivier Arteau
 */

class NickServ implements Module {
	private $resultat;
	
    public function executerCommande(array $param, StatusObject $status) {
    	
    	// Vérification commune //
    	if (!isset($param['password'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou incorrect'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant ou incorrect');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$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 'nsregister' :
    			return $this->commandeRegister($param, $status);
    		case 'nslogin' :
    			return $this->commandeLogin($param, $status);
    		case 'nskick' :
    			return $this->commandeKick($param, $status);
		}
    }
    
    private function commandeRegister(array $param, StatusObject $status) {
    	$utilisateur = Session::getUtilisateurCourrant();
    	
    	// Vérification si le nom est déjà enregistré //
    	$bd = BDConnexion::getBDConnexion();
    	$sql = 'SELECT id FROM nsutilisateurs WHERE nom=?';
    	$parametre = array($utilisateur->getNom());
    	$resultat = $bd->execQuerySelect($sql, $parametre);
    	
    	if (count($resultat) > 0) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Nom déjà enregistré'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Nom déjà enregistré');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$enc = Encryption::encrypter($param['password']);
    	$sql = 'INSERT INTO nsutilisateurs (`nom`, `password`, `flags`) VALUES (?,?,?)';
    	$parametre = array($utilisateur->getNom(), $enc, FLAG_REGISTER);
    	$bd->execQuery($sql, $parametre);
    	
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'Nom enregistré avec succès'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeLogin(array $param, StatusObject $status) {
    	$utilisateur = Session::getUtilisateurCourrant();
    	
    	$enc = Encryption::encrypter($param['password']);
    	$bd = BDConnexion::getBDConnexion();
    	$sql = 'SELECT flags FROM nsutilisateurs WHERE nom=? AND password=?';
    	$parametre = array($utilisateur->getNom(), $enc);
    	$resultat = $bd->execQuerySelect($sql, $parametre);
    	
    	if (count($resultat) < 1) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Utilisateur non enregistré ou mot de passe incorrect'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Utilisateur non enregistré ou mot de passe incorrect');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	$utilisateur->ajouterFlag($resultat[0]['flags']);
    	
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'Utilisateur connecté avec succès'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    private function commandeKick(array $param, StatusObject $status) {
    	// Vérification des paramètres //
    	if (!isset($param['username'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou incorrect'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant ou incorrect');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// Vérification à savoir si la personne que l'on veut kické est loggé //
    	$utilisateur = null;
    	try {
    		$utilisateur = new Utilisateur($param['username']);
    		$utilisateur->getID();
    	} catch (Exception $e) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Personne n\'est connecté avec ce nom.'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Personne n\'est connecté avec ce nom.');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// Vérification du mot de passe //
    	$enc = Encryption::encrypter($param['password']);
    	$bd = BDConnexion::getBDConnexion();
    	$sql = 'SELECT flags FROM nsutilisateurs WHERE nom=? AND password=?';
    	$parametre = array($utilisateur->getNom(), $enc);
    	$resultat = $bd->execQuerySelect($sql, $parametre);
    	
    	if (count($resultat) < 1) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Nom non-enregistré ou mot de passe incorrecte.'
    		);
    		
    		// Cancelation de l'événement //
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Nom non-enregistré ou mot de passe incorrecte.');
    		$status->cancel();
    		
    		return $status;
    	}
    	
    	// On kick la personne //
    	$utilisateur->setLastPing(0);
    	$this->resultat = array(
    		'resultat' => 'true',
    		'message' => 'L\'utilisateur a été forcé de quitter avec succès.'
    	);
    	
    	return PAFServer::$NO_ACTION_TAKEN;
    }
    
    public function onStatusChange(array $param, StatusObject $newStatus) {
    	
    }
    
    public function getCommandesEnregistre() {
    	return array('nsregister', 'nslogin', 'nskick');
    }
    
    public function finalize(array $param, StatusObject $status) {
    	JSONOutput::output($this->resultat);
    }
}

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