/**
 * 
 */
package reseau;

import java.util.ArrayList;

import client.model.benchmark.Benchmarks;
import client.model.problem.Parameters;
import client.model.problem.Resultat;

/**
 * Interface décrivant les opérations mathématiques permises par l'application
 * Facade déstiné à être utilisé par les classes clientes afin d'abstraire les mécanismes réseaux
 * @author Andréa
 *
 */
public interface IMathematicsOperationsProxyFacade {
	
	/**
	 * Résouds un problème par une méthode donnée et renvoi un résultat correspondant
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe au sein duquel l'opération est effectuée.
	 * @param problemid
	 * 		Id du problème à résoudre
	 * @param conditionsInitials
	 * 		Conditions initiales du problème
	 * @param methodid
	 * 		Id de la méthode de résolution
	 * @return
	 * 		{@link Resultat} correspondant
	 * @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
	 * @throws MathematicsException
	 * 		Erreur dans la résolution du problème
	 */
	public Resultat resolve(int userid, int groupid, int problemid, ArrayList<Parameters> conditionsInitials, int methodid) throws DataNotFoundException, UnauthorizedOperationException, MathematicsException;
	
	/**
	 * Résouds un problème par les méthodes données en les benchant
	 * @param userid
	 * 		Id de l'utilisateur effectuant l'action.
	 * @param groupid
	 * 		Id du groupe au sein duquel l'opération est effectuée.
	 * @param problemid
	 * 		Id du problème à résoudre
	 * @param initialConditions
	 * 		Conditions initiales du problème
	 * @param methodids
	 * 		Id des méthodes de résolution
	 * @return
	 * 		{@link Benchmarks} correspondant
	 * @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
	 * @throws MathematicsException
	 * 		Erreur dans la résolution du problème
	 */
	public Benchmarks resolve(int userid, int groupid, int problemid, ArrayList<Parameters> initialConditions,  int... methodids) throws DataNotFoundException, UnauthorizedOperationException, MathematicsException;

}
