import weiss.nonstandard.*;
public abstract class SimulationModel {
    private double currentTime;
    private PriorityQueue eventSet;
    private int numberEvents;
    private boolean simulationStopped;
    private String simulationTitle;

    public SimulationModel(String title ) {
        currentTime = 0.0;
        eventSet = new BinaryHeap( );
        numberEvents = 0;
        simulationTitle = title;
    }

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

    public abstract void initializeEvents( );
    public abstract void processEvent(Event e);

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

    public final void setSimulationStopped(){
        simulationStopped = true;
    }

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

    public String toString( ) {
        return simulationTitle + ": Time = " + currentTime
                + ", Events = " + numberEvents;
    }

}


