/**
 * 
 */
package reseau;

import client.model.benchmark.Benchmarks;
import client.model.group.Groupe;
import client.model.problem.Probleme;
import client.model.problem.Resultat;
import client.model.user.Utilisateur;

/**
 * Inteface décrivant des opérations permettant la gestion des utilisateurs et groupes
 * Facade déstiné à être utilisé par les classes clientes afin d'abstraire les mécanismes réseaux
 * @author Andréa
 *
 */
public interface IManagementOperationProxyFacade {
	
	/**
	 * Méthode d'authentification
	 * @param login
	 * 		user login
	 * @param password
	 * 		user password
	 * @return
	 * 		Utilisateur loggé
	 * @throws DataNotFoundException
	 * 		Authentification raté
	 */
	public Utilisateur authentify(String login, String password) throws DataNotFoundException;
	/**
	 * Permet à un utilisateur de rejoindre un groupe
	 * @param login
	 * 		user login
	 * @throws DataNotFoundException
	 * 		Si la donnée demandée n'existe pas
	 */
	public void        joinGroup(String login, int groupid) throws DataNotFoundException;
	
	/**
	 * Récupère la liste des groupes
	 * @return
	 * 		liste des groupes existant
	 */
	public Groupe[] getGroups();
	
	/**
	 * Récupère la liste des utilisateurs d'un groupe
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe que l'on veut inspecter.
	 * @return users
	 * 		les utilisateurs du groupe concerné
	 * @throws DataNotFoundException
	 * 		Si la donnée demandée n'existe pas
	 * @throws UnauthorizedOperationException
	 * 		L'utilisateur n'a pas le droit d'effectuer cette opération
	 */
	public Utilisateur[] getUsers(int userid, int groupid) throws DataNotFoundException, UnauthorizedOperationException;


	/**
	 * Récupère la liste des problemes d'un groupe
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe que l'on veut inspecter.
	 * @return problems
	 * 		les problemes du groupe concerné
	 * @throws DataNotFoundException
	 * 		Si la donnée demandée n'existe pas
	 * @throws UnauthorizedOperationException
	 * 		L'utilisateur n'a pas le droit d'effectuer cette opération
	 */
    public Probleme[]    getProblems(int userid, int groupid) throws DataNotFoundException, UnauthorizedOperationException;

	/**
	 * Récupère la liste des resultats d'un groupe pour un probleme donné
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe que l'on veut inspecter.
     * @param targetproblemid
     *      Id du problème relié aux résultats
	 * @return results
	 * 		les résultats du groupe concerné
	 * @throws DataNotFoundException
	 * 		Si la donnée demandée n'existe pas
	 * @throws UnauthorizedOperationException
	 * 		L'utilisateur n'a pas le droit d'effectuer cette opération
	 */
    public Resultat[]    getResults(int userid, int groupid, int targetproblemid) throws DataNotFoundException, UnauthorizedOperationException;

	/**
	 * Récupère la liste des problemes d'un groupe
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe que l'on veut inspecter.
     * @param targetproblemid
     *      Id du problème relié aux benchmarks
	 * @return benchmarks
	 * 		les benchmarks du groupe concerné
	 * @throws DataNotFoundException
	 * 		Si la donnée demandée n'existe pas
	 * @throws UnauthorizedOperationException
	 * 		L'utilisateur n'a pas le droit d'effectuer cette opération
	 */
    public Benchmarks[]  getBenchmarks(int userid, int groupid, int targetproblemid) throws DataNotFoundException, UnauthorizedOperationException;
}
