/******************************************
 *  Seg 2501, hiver 2002 Devoir # 4
 *
 *  file Caissiere.java
 *  Simulates a number of cashiers and their
 *  temporal behaviour when serving clients.
 *
 *  @author  Anne Bertrand
 *  @author  Robin Tropper
 *  @refactoredBy Robin Tropper  B.Sc.A.
 *
 ******************************************/

import java.util.*;

class Cashier {
	private String name;
	private Timer scheduleNextClient;
	private long paperWorkTime;
	
	public Cashier(int num) {
		scheduleNextClient = new Timer();
		name="Cash_"+num;
		//estimons de 2 à 4 minutes pour la
		//paperasse entre clients
		paperWorkTime = GenerateurR.generer(30, 10);
		System.out.println("START "+name);
		nextClient();
	}//fin constructeur
	
	class ServeNext extends TimerTask {
		Cashier caisse = null;		
		public void run() {
			nextClient();
		}//fin du run
	}//fin de classe interne
	
	private void nextClient(){
		Client clientToServe = null;
		List<ClientQueue> queuesInBank = Bank.showQueues();
		long servingTime = -1;
		while( clientToServe == null ){
			
			//OPTIONNaL :
			//time for paperwork!
			try {
				Thread.sleep( paperWorkTime );
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			
			//find the next client out of the various queues
			for(int  i=0; i<queuesInBank.size(); i++){
				try {
					clientToServe = queuesInBank.get(i).serve();
					servingTime = clientToServe.getRequiredServiceTime();
					System.out.println("------ cashier "+name+" : serving client "+clientToServe.getName()+" ------");
					//client trouvé en priorité, ne cherchez pas plus loin
					break;
				} catch (Exception e) {
					//file vide : aucun client à servir - passe au prochain
					System.out.println("------ cashier "+name+" : no clients right now ------");
					if( Bank.isClosed() ){
						return;
					}	
					//no client, do paperwork while waiting
					try {
						Thread.sleep(paperWorkTime*5);//5: arbitrary
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
				}//fin try prochain client
			}//fin parcours des files
			
		}//fin while pas de client à servir
		
		scheduleNextClient.schedule(new ServeNext(), servingTime );
	}//fin prochain client

}//fin de classe Caissière