import weiss.nonstandard.*;
public class SingleIncoming {

   private double currentTime;
   private PriorityQueue eventSet;
   private int numberEvents;
   private String simulationTitle;
   private boolean simulationStopped;

   private IncomingLine inLine;

   public SingleIncoming(String title, double arrival) {
        currentTime = 0.0;
        eventSet = new BinaryHeap( );
        numberEvents = 0;
        simulationTitle = title;
        simulationStopped = false;
        inLine = new IncomingLine(1, 0, arrival);
    }

    final public void addEvent( Event e) { eventSet.insert(e); }
    final public int getEvents( ) { return numberEvents; }
    final public double getTime( ) { return currentTime; }
    final public String getTitle( ) { return simulationTitle; }

    public void initializeEvents( ) {
       addEvent(inLine.getNextArrival());
    }

    public void initializeSimulation(double stoppingTime){
        addEvent(new Event(0, Event.STOP, stoppingTime));
        simulationStopped = false;
    }

    public void processEvent(Event e) {
       switch (e.getWhat()) {
          case Event.MSG_ARRIVAL:
             addEvent(inLine.getNextArrival());
             break;
         case Event.STOP:
             setSimulationStopped();
             break;
         default:
             System.err.println(e +  " {unrecognized event}");
             break;
       }
    }

    public void setSimulationStopped(){
        simulationStopped = true;
    }

    final public void run(double stoppingTime) {
        Event e = null;
        initializeSimulation(stoppingTime);
        initializeEvents();
        while(!simulationStopped && !eventSet.isEmpty()) {
           e = (Event) (eventSet.deleteMin( ));
           numberEvents++;
           currentTime = e.getWhen( );
           processEvent(e);
        }
    }
}
