import java.util.*;

public class Flight implements FlightUtils {

  int flightNumber;
  int miles;
  int seats;
  int passengers;
  int currSeat;

  private static final String chicken = "chicken";
  private static final String beef = "beef";

  TravellerListUtils pList;

  public Flight(int flightNumber, int miles, int seats){
	  this.flightNumber = flightNumber;
	  this.miles = miles;
	  this.seats = seats;
	  currSeat = 1;
	  pList = new TravellerList();
  }

  /* Access methods:*/
  public void setFlightNumber(int fp){ flightNumber = fp;}
  public void setMiles(int m){miles = m;}
  public void setSeats(int s){seats = s;}

  public int getFlightNumber(){return flightNumber;}
  public int getMiles(){return miles;}
  public int getSeats(){return seats;}

  public void checkinPassenger(Passenger p) throws OverBookedException{
	  if (currSeat>seats){
		  throw new OverBookedException();
	   }

	  p.setSeat(currSeat);
	  if (currSeat%2 ==0) {
		  p.setMeal(chicken);
	  }else {
		  p.setMeal(beef);
	  }

	  pList.addTraveller(p);
	  currSeat++;
  }

  public void checkinInfant(Infant i) throws InfantTooOldException{
	  if (i.getAge() > 24){
		  throw new InfantTooOldException();
	  }
      pList.addTraveller(i);
  }

  public void printPersonsOnPlane(){
	  Enumeration fifo = pList.fifoIterator();
	  while (fifo.hasMoreElements()){
		  Object p = fifo.nextElement();
		  System.out.println(p);
	   }
  }

  public void printMeals(){
	  Enumeration lifo = pList.lifoIterator();
	  while (lifo.hasMoreElements()){
		  Object p = lifo.nextElement();
		  if (p instanceof Passenger){
			  System.out.println(p);
		  }
	   }
  }
  public void updateEliteMiles(){
	  Enumeration pfifo = pList.pfifoIterator();
	  while (pfifo.hasMoreElements()){
		  Object p = pfifo.nextElement();
		  ((ElitePassenger)p).incMiles(miles);
		  System.out.println(p);
	   }
  }

  public String toString(){
	  return("Flight # " +flightNumber+": "+miles+" miles, "+seats+" seats");

  }

}
