package SimkitOpenDis7Examples;

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

/**
 * One of the simplest non-trivial Event Graph models. A series of Arrival
 * events is scheduled based on an inter arrival time random variate. The state
 * variable, simply counts the number of these arrivals.
 *
 * @author abuss@nps.edu
 */
public class ArrivalProcess extends SimEntityBase {

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

    /**
     * State variable that counts the number of Arrival events
     */
    protected int numberArrivals;

    /**
     * Instantiate an ArrivalProcess with the given interarrivalTimeGenerator
     *
     * @param interarrivalTimeGenerator Given RandomVariate for interarrival
     * times
     */
    public ArrivalProcess(RandomVariate interarrivalTimeGenerator) {
        this.setInterarrivalTimeGenerator(interarrivalTimeGenerator);
    }

    /**
     * If the ArrivalProcess is instantiated using the zero-argument
     * constructor, be sure the set the interarrivalTimeGenerator with an
     * explicit call to its setter method.
     */
    public ArrivalProcess() {
    }

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

    /**
     * Schedule the first Arrival event with delay generated by
     * interarrivalTimeGenerator
     */
    public void doRun() {
        firePropertyChange("numberArrivals", getNumberArrivals());

        waitDelay("Arrival", interarrivalTimeGenerator);
    }

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

        waitDelay("Arrival", interarrivalTimeGenerator);
    }

    /**
     * accessor method to get a state variable
     * @return the interarrivalTimeGenerator
     */
    public RandomVariate getInterarrivalTimeGenerator() {
        return interarrivalTimeGenerator;
    }

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

    /**
     * accessor method to get a state variable
     * @return the numberArrivals
     */
    public int getNumberArrivals() {
        return numberArrivals;
    }
}