<?php

define('FLAG_OPERATEUR', 'o');
define('FLAG_ADMINISTRATEUR', 'a');

/**
 * Module qui gère les administrateurs
 * 
 * Note : Dépendance vers le service NickServ
 * 
 * @author Olivier Arteau
 */

class AdminServ implements Module {

    public function executerCommande(array $param, StatusObject $status) {
    	
    	 
    	// Vérification commune //   	
    	if (!isset($param['username'])) {
    		$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Paramètre manquant ou invalide.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Paramètre manquant ou invalide.');
    		$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 'askick' :
    			return $this->commandeKick($param, $status);
    		case 'asaddadmin' : 
    			return $this->commandeAddAdmin($param, $status);
    		case 'asaddop' : 
    			return $this->commandeAddOp($param, $status);
		}
    }
    
    private function commandeKick(array $param, StatusObject $status) {
		$utilisateur = Session::getUtilisateurCourrant();
		
		if (!$utilisateur->hasFlags(FLAG_OPERATEUR) && !$utilisateur->hasFlags(FLAG_ADMINISTRATEUR)) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous devez être opérateur ou administrateur pour faire cette commande.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous devez être opérateur ou administrateur pour faire cette commande.');
    		$status->cancel();
    		
    		return $status;
		}
		
		try {
			$toKick = new Utilisateur($param['username']);
			$toKick->getID();
		} catch (Exception $e) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'La personne que vous voulez kické n\'existe pas.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('La personne que vous voulez kické n\'existe pas.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$toKick->setLastPing(0);
    }
    
    private function commandeAddAdmin(array $param, StatusObject $status) {
		$utilisateur = Session::getUtilisateurCourrant();
		
		if (!$utilisateur->hasFlags(FLAG_ADMINISTRATEUR)) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous devez être administrateur pour faire cette commande.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous devez être administrateur pour faire cette commande.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify = null;
		try {
			$userToModify = new Utilisateur($param['username']);
			$userToModify->getID();
		} catch(Exception $e) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié n\'existe pas.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié n\'existe pas.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$bd = BDConnexion::getBDConnexion();
		$sql = 'SELECT id FROM nsutilisateurs WHERE nom=? AND flags LIKE ?';
		$parametre = array($userToModify->getNom(), '%' . FLAG_ADMINISTRATEUR . '%');
		$resultat = $bd->execQuerySelect($sql, $parametre);
		
		if (count($resultat) >= 1) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié est déjà administrateur.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié est déjà administrateur.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$bd = BDConnexion::getBDConnexion();
		$sql = 'UPDATE nsutilisateurs n SET n.flags=CONCAT(n.flags,?) WHERE n.nom=?';
		$parametre = array(FLAG_ADMINISTRATEUR . FLAG_OPERATEUR, $userToModify->getNom());
		$bd->execQuery($sql, $parametre);
		
		if ($bd->getNumberAffectedRow() >= 1) {
			if ($userToModify->hasFlags(FLAG_REGISTER))
				$userToModify->ajouterFlag(FLAG_ADMINISTRATEUR . FLAG_OPERATEUR);
			
			$this->resultat = array(
	    		'resultat' => 'true',
	    		'message' => $userToModify->getNom() . ' est maintenant administrateur.'
	    	);
	    	
	    	return PAFServer::$NO_ACTION_TAKEN;
		} else {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur doit être enregistré pour avoir les droits d\'administrateur.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur doit être enregistré pour avoir les droits d\'administrateur.');
    		$status->cancel();
    		
    		return $status;
		}
    }
    
    private function commandeAddOp(array $param, StatusObject $status) {
		$utilisateur = Session::getUtilisateurCourrant();
		
		if (!$utilisateur->hasFlags(FLAG_ADMINISTRATEUR)) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'Vous devez être administrateur pour faire cette commande.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('Vous devez être administrateur pour faire cette commande.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$userToModify = null;
		try {
			$userToModify = new Utilisateur($param['username']);
			$userToModify->getID();
		} catch(Exception $e) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié n\'existe pas.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié n\'existe pas.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$bd = BDConnexion::getBDConnexion();
		$sql = 'SELECT id FROM nsutilisateurs WHERE nom=? AND flags LIKE ?';
		$parametre = array($userToModify->getNom(), '%' . FLAG_OPERATEUR . '%');
		$resultat = $bd->execQuerySelect($sql, $parametre);
		
		if (count($resultat) >= 1) {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur spécifié est déjà modérateur.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur spécifié est déjà modérateur.');
    		$status->cancel();
    		
    		return $status;
		}
		
		$sql = 'UPDATE nsutilisateurs n SET n.flags=CONCAT(n.flags,?) WHERE n.nom=?';
		$parametre = array(FLAG_OPERATEUR, $userToModify->getNom());
		$bd->execQuery($sql, $parametre);
		
		if ($bd->getNumberAffectedRow() >= 1) {
			if ($userToModify->hasFlags(FLAG_REGISTER))
				$userToModify->ajouterFlag(FLAG_OPERATEUR);
			
			$this->resultat = array(
	    		'resultat' => 'true',
	    		'message' => $userToModify->getNom() . ' est maintenant modérateur.'
	    	);
	    	
	    	return PAFServer::$NO_ACTION_TAKEN;
		} else {
			$this->resultat = array(
    			'resultat' => 'false',
    			'message' => 'L\'utilisateur doit être enregistré pour avoir les droits de modérateur.'
    		);
    		
    		if (get_class($status) != 'CommandStatus')
    			$status = new CommandStatus();
    		$status->addMessage('L\'utilisateur doit être enregistré pour avoir les droits de modérateur.');
    		$status->cancel();
    		
    		return $status;
		}
    }
    
    public function onStatusChange(array $param, StatusObject $newStatus) {
    	
    }
    
    public function getCommandesEnregistre() {
    	return array('askick', 'asaddadmin', 'asaddop');
    }
    
    public function finalize(array $param, StatusObject $status) {
    	JSONOutput::output($this->resultat);
    }
}

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