package mv3302;

import simkit.SimEntityBase;
import simkit.random.RandomVariate;

/**
 * A simple (yet useful) simulation component that schedules Arrival events
 * using a <code>RandomVariate</code> instance for the times between Arrival
 * events.<br>
 * The state <code>numberArrivals></code> is incremented at each Arrival event.
 *
 * @author ahbuss
 */
public class ArrivalProcess extends SimEntityBase {

    /**
     * Generates interarrival times
     */
    private RandomVariate interarrivalTimeGenerator;

    /**
     * The number of arrivals at any given (sim) time
     */
    protected int numberArrivals;

    /**
     * Zero-argument constructor
     */
    public ArrivalProcess() {
    }

    /**
     * Instantiate an Arrival Process with the given interarrivalTimeGenerator
     *
     * @param interarrivalTimeGenerator Given interarrivalTimeGenerator
     */
    public ArrivalProcess(RandomVariate interarrivalTimeGenerator) {
        setInterarrivalTimeGenerator(interarrivalTimeGenerator);
    }

    /**
     * Initialize numberArrivals to 0
     */
    @Override
    public void reset() {
        super.reset();
        numberArrivals = 0;
    }

    /**
     * Schedule first Arrival event with delay of interarrival time
     */
    public void doRun() {
        firePropertyChange("numberArrivals", getNumberArrivals());
        waitDelay("Arrival", interarrivalTimeGenerator);
    }

    /**
     * Increment numberArrivals<br>
     * Schedule next Arrival event with delay of interarrival time
     */
    public void doArrival() {
        int oldNumberArrivals = getNumberArrivals();
        numberArrivals += 1;
        firePropertyChange("numberArrivals", oldNumberArrivals, getNumberArrivals());

        waitDelay("Arrival", interarrivalTimeGenerator);
    }

    /**
     * @return the interarrivalTimeGenerator
     */
    public RandomVariate getInterarrivalTimeGenerator() {
        return interarrivalTimeGenerator;
    }

    /**
     * @param interarrivalTimeGenerator the interarrivalTimeGenerator to set
     */
    public void setInterarrivalTimeGenerator(RandomVariate interarrivalTimeGenerator) {
        this.interarrivalTimeGenerator = interarrivalTimeGenerator;
    }

    /**
     * @return the numberArrivals
     */
    public int getNumberArrivals() {
        return numberArrivals;
    }

}