/******************************************
 *  Seg 2501, hiver 2002 Devoir # 4
 *
 *  fichier Caissiere.java
 *  Simule un nombre de caissières et leur
 *  comportement au service des clients
 *
 *  @author  Anne Bertrand
 *  @author  Robin Tropper
 *  @refactoredBy Robin Tropper  B.Sc.A.
 *
 ******************************************/

import java.util.*;

class Caissiere {
	private String nom;
	private Timer ceduleProchain;
	private long tempsDePaperasse;
	
	public Caissiere(Timer cedule, int num) {
		ceduleProchain = cedule;
		nom="Caisse_"+num;
		//estimons de 2 à 4 minutes pour la
		//paperasse entre clients
		tempsDePaperasse = GenerateurR.generer(30, 10);
		System.out.println("DEMARRE "+nom);
		prochainClient();
	}//fin constructeur

	class ServirProchain extends TimerTask {
		Caissiere caisse = null;		
		public void run() {
			prochainClient();
		}//fin du run
	}//fin de classe interne
	
	private void prochainClient(){
		Client clientAServir = null;
		List<FileClient> filesEnBanque = Banque.montreFiles();
		long tempsService = -1;
		while( clientAServir == null ){
			
			//OPTIONNEL :
			//le temps de préparer la paperasse!
			try {
				Thread.sleep( tempsDePaperasse );
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			
			//trouver le prochain client à servir
			for(int  i=0; i<filesEnBanque.size(); i++){
				try {
					clientAServir = filesEnBanque.get(i).Servir();
					tempsService = clientAServir.getTempsAServir();
					System.out.println("------ caissière "+nom+" : sert client "+clientAServir.getNom()+" ------");
					//client trouvé en priorité, ne cherchez pas plus loin
					break;
				} catch (Exception e) {
					//file vide : aucun client à servir - passe au prochain
					System.out.println("------ caissière "+nom+" : pas de clients prêts en ce moment ------");
					//e.printStackTrace();
				}
			}//fin parcours des files
		}//fin while pas de client à servir
		
		//si client pas trouvé = peut-être fermé?
		//sinon, fais un peu de paperasse :
		if( tempsService == -1){
			//la banque ferme = arrête!
			if( Banque.getCloture() ){
				return;
			}			
			tempsService = tempsDePaperasse;
		}//fin si pas de client en attente

		ceduleProchain.schedule(new ServirProchain(), tempsService );
	}//fin prochain client

}//fin de classe Caissière