<commit_before>package Controleurs;

import java.util.ArrayList;

import Client.Batiment;
import Requetes.Requete;
import Requetes.RequeteExterne;

/**Controleur correspondant a celui du sujet. Il en existe un par {@link Batiment} et permet de traiter les {@link RequeteExterne}
 * en choisissant quel est le meilleur {@link ControleurInterne} (donc {@link Ascenseur}) pour traiter la demande.
 * @author Thomas
 */
public class ControleurExterne implements IControleur{

	/**Il n'existe qu'un seul ControleurExterne par {@link Batiment} donc c'est un singleton.
	 * 
	 */
	final private static ControleurExterne singleton = new ControleurExterne ();
	
	/**Liste des {@link Requete} a traiter. Chaque {@link Requete} devrait etre une {@link RequeteExterne} pour fonctionner correctement.
	 * Sinon elle seront interpretee comme telle et n'auront pas le resultat attendu.
	 * 
	 */
	private ArrayList<Requete> requetes = new ArrayList<Requete>();
	
	/**Liste des {@link ControleurInterne} (et donc des {@link Ascenseur}) disponibles.
	 * 
	 */
	private ArrayList<ControleurInterne> controleurs;
	
	
	/**Variable utilisee durant {@link ControleurExterne#traiterRequetes()}.
	 * @see ControleurExterne#traiterRequetes()
	 */
	private ControleurInterne aUtiliser;
	
	
	/**Utilise pour connaitre le nombre d'etages. Utilise dans {@link ControleurExterne#searchLessActive()}
	 * @see ControleurExterne#searchLessActive()
	 */
	private int nbEtage;
	
	/**ControleurExterne est un singleton donc le constructeur est private.
	 * 
	 */
	private ControleurExterne () {}
	
	/**Comme c'est un singleton, on doit definir par la suite les attributs. Cela est effectue dans le constructeur de {@link Batiment}
	 * @param controleurs liste des {@link ControleurInterne} disponnibles
	 * @see Batiment#Batiment(String, int, int)
	 */
	public void defineControleursInterne (ArrayList<ControleurInterne> controleurs) {
		this.controleurs = controleurs;
	}
	
	/**Comme c'est un singleton, on doit definir par la suite les attributs. Cela est effectue dans le constructeur de {@link Batiment}
	 * @param nbEtage nombre d'etage du {@link Batiment} correspondant.
	 * @see Batiment#Batiment(String, int, int)
	 */
	public void defineBatiment (int nbEtage) {
		this.nbEtage = nbEtage;
	}
	
	/**Obtient le singleton
	 * @return le singleton
	 */
	public static ControleurExterne getControleurExterne() {
		return singleton;
	}
	
	/**Permet d'ajouter une {@link RequeteExterne} a {@link ControleurExterne#requetes}.
	 * @param etage l'etage a partir duquel vient la {@link RequeteExterne}
	 * @param direction {@link Requete#libelle} que prend la {@link RequeteExterne} : "Haut" ou "Bas".
	 * @see RequeteExterne
	 */
	public void addRequete (int etage, String direction) {
		requetes.add(new RequeteExterne(etage, direction));
	}
	
	/**Permet de traiter toutes les requetes de {@link ControleurExterne#requetes}
	 * 
	 */
	public void traiterRequetes () {

		//Algo Naif
//		for (int i = 0; i < requetes.size(); ++i) {
//			controleurs.get(0).addRequete(requetes.get(i));
//			requetes.remove(requetes.get(i));
//		}
		
		//Algo "avance"
		for (int i = 0; i < requetes.size();++i) {
			
			if (searchForInactive()) {}
			else if (requetes.get(i).getLibelle().equals("Haut")) {
				if (searchToUp(requetes.get(i).getEtageDemande())) {}
				else {
					searchLessActive ();
				}
			}
			else {
				if(searchToDown(requetes.get(i).getEtageDemande())) {}
				else {
					searchLessActive ();
				}				
			}
			aUtiliser.addRequete(requetes.get(i));
			requetes.remove(requetes.get(i));
			--i;
		}
		

	}
	
	/**Utiliser dans {@link ControleurExterne#traiterRequetes()}. Permet de connaitre s'il y a un {@link ControleurInterne}
	 *  innactif parmis {@link ControleurExterne#controleurs}.
	 * Si c'est le cas, alors {@link ControleurExterne#aUtiliser} le designera et la fonction renvera true.
	 * @return true si un {@link ControleurInterne} innactif a ete trouve false sinon.
	 * @see ControleurExterne#traiterRequetes()
	 */
	private boolean searchForInactive () {
		for (ControleurInterne controleur : controleurs) {
			if (0 == controleur.getNumberOfRequete()) {
				this.aUtiliser = controleur;
				return true;
			}
		}
		return false;
	}
	
	/**Utiliser dans {@link ControleurExterne#traiterRequetes()}. Permet de verifier si l'etage d'ou provient la {@link Requete}<commit_msg>Modification de l'algorithme de repartition des requetes externe pour utiliser l'affectation de requete prioritaire<commit_after>package Controleurs;

import java.util.ArrayList;

import Client.Batiment;
import Requetes.Requete;
import Requetes.RequeteExterne;

/**Controleur correspondant a celui du sujet. Il en existe un par {@link Batiment} et permet de traiter les {@link RequeteExterne}
 * en choisissant quel est le meilleur {@link ControleurInterne} (donc {@link Ascenseur}) pour traiter la demande.
 * @author Thomas
 */
public class ControleurExterne implements IControleur{

	/**Il n'existe qu'un seul ControleurExterne par {@link Batiment} donc c'est un singleton.
	 * 
	 */
	final private static ControleurExterne singleton = new ControleurExterne ();
	
	/**Liste des {@link Requete} a traiter. Chaque {@link Requete} devrait etre une {@link RequeteExterne} pour fonctionner correctement.
	 * Sinon elle seront interpretee comme telle et n'auront pas le resultat attendu.
	 * 
	 */
	private ArrayList<Requete> requetes = new ArrayList<Requete>();
	
	/**Liste des {@link ControleurInterne} (et donc des {@link Ascenseur}) disponibles.
	 * 
	 */
	private ArrayList<ControleurInterne> controleurs;
	
	
	/**Variable utilisee durant {@link ControleurExterne#traiterRequetes()}.
	 * @see ControleurExterne#traiterRequetes()
	 */
	private ControleurInterne aUtiliser;
	
	
	/**Utilise pour connaitre le nombre d'etages. Utilise dans {@link ControleurExterne#searchLessActive()}
	 * @see ControleurExterne#searchLessActive()
	 */
	private int nbEtage;
	
	/**ControleurExterne est un singleton donc le constructeur est private.
	 * 
	 */
	private ControleurExterne () {}
	
	/**Comme c'est un singleton, on doit definir par la suite les attributs. Cela est effectue dans le constructeur de {@link Batiment}
	 * @param controleurs liste des {@link ControleurInterne} disponnibles
	 * @see Batiment#Batiment(String, int, int)
	 */
	public void defineControleursInterne (ArrayList<ControleurInterne> controleurs) {
		this.controleurs = controleurs;
	}
	
	/**Comme c'est un singleton, on doit definir par la suite les attributs. Cela est effectue dans le constructeur de {@link Batiment}
	 * @param nbEtage nombre d'etage du {@link Batiment} correspondant.
	 * @see Batiment#Batiment(String, int, int)
	 */
	public void defineBatiment (int nbEtage) {
		this.nbEtage = nbEtage;
	}
	
	/**Obtient le singleton
	 * @return le singleton
	 */
	public static ControleurExterne getControleurExterne() {
		return singleton;
	}
	
	/**Permet d'ajouter une {@link RequeteExterne} a {@link ControleurExterne#requetes}.
	 * @param etage l'etage a partir duquel vient la {@link RequeteExterne}
	 * @param direction {@link Requete#libelle} que prend la {@link RequeteExterne} : "Haut" ou "Bas".
	 * @see RequeteExterne
	 */
	public void addRequete (int etage, String direction) {
		requetes.add(new RequeteExterne(etage, direction));
	}
	
	/**Permet de traiter toutes les requetes de {@link ControleurExterne#requetes}
	 * 
	 */
	public void traiterRequetes () {

		for (int i = 0; i < requetes.size();++i) {//parcours de toutes les requetes externe non affectees
			
			if (searchForInactive()) {//cherche d'abord si des ascenseurs sont inactifs
				aUtiliser.addRequete(requetes.get(i));
				requetes.remove(requetes.get(i));
				--i;//repositionne i sur la requete suivante, puisque la requete courante viens d'etre supprimee
			}
			else if (requetes.get(i).getLibelle().equals("Haut")) {//si on veut aller vers le haut
				if (searchToUp(requetes.get(i).getEtageDemande())) {
					/*Cherche un ascenseur qui est en-dessous de l'etage de la requete 
					et qui se dirige vers un etage superieur ou egal a celui de la requete*/
					aUtiliser.addRequetePrioritaire(requetes.get(i));// ajout de la requete de maniere prioritaire
					requetes.remove(requetes.get(i));
					--i;
				}
				else {//Sinon on cherche l'ascenseur ayant le moins de requete en attente
					searchLessActive ();
					aUtiliser.addRequete(requetes.get(i));
					requetes.remove(requetes.get(i));
					--i;
				}
			}
			else {//si on veut aller vers le bas
				if(searchToDown(requetes.get(i).getEtageDemande())) {
					/*Cherche un ascenseur qui est au-dessus de l'etage de la requete 
					et qui se dirige vers un etage inferieur ou egal a celui de la requete*/
					aUtiliser.addRequetePrioritaire(requetes.get(i));
					requetes.remove(requetes.get(i));
					--i;
				}
				else {//Sinon on cherche l'ascenseur ayant le moins de requete en attente
					searchLessActive ();
					aUtiliser.addRequete(requetes.get(i));
					requetes.remove(requetes.get(i));
					--i;
				}				
			}
		}
		

	}
	
	/**Utiliser dans {@link ControleurExterne#traiterRequetes()}. Permet de connaitre s'il y a un {@link ControleurInterne}
	 *  innactif parmis {@link ControleurExterne#controleurs}.
	 * Si c'est le cas, alors {@link ControleurExterne#aUtiliser} le designera et la fonction renvera true.
	 * @return true si un {@link ControleurInterne} innactif a ete trouve false sinon.
	 * @see ControleurExterne#traiterRequetes()
	 */
	private boolean searchForInactive () {
		for (ControleurInterne controleur : controleurs) {
			if (0 == controleur.getNumberOfRequete()) {
				this.aUtiliser = controleur;
				return true;
			}
		}
		return false;
	}
	
	/**Utiliser dans {@link ControleurExterne#traiterRequetes()}. Permet de verifier si l'etage d'ou provient la {@link Requete}
{'fraction_non_alphanumeric': 0.10786218178100399, 'fraction_numerical': 0.0006134342091810653, 'mean_word_length': 4.118785975928833, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7644876', 'n_tokens_mistral': 3617, 'n_tokens_neox': 3299, 'n_words': 951}