package pipe.historyActions;

import uk.ac.imperial.pipe.models.petrinet.Transition;

import java.util.List;

/**
 * History manager for stepping through animation actions when the Petri net is in animation mode
 */
public interface AnimationHistory {
    /**
     * Cannot step forward if head of the list
     * @return true if stepping forward within the animation is allowed, that is if there are transition firings to redo
     */
    boolean isStepForwardAllowed();

    /**
     * Can step back if currentPosition points to any transitions
     * @return  true if stepping backward within the animation is allowed, that is if there are transition firings to undo
     */
    boolean isStepBackAllowed();

    /**
     * Steps forward, updating the current item
     */
    void stepForward();

    /**
     * Steps backward, updating the current item
     */
    void stepBackwards();

    /**
     * Remove all steps past the current step
     */
    void clearStepsForward();

    /**
     *
     * @return a list of transitions fired
     */
    List<Transition> getFiringSequence();

    /**
     *
     * @return current position in the firing sequence
     */
    int getCurrentPosition();

    /**
     *
     * Register that this transition has been fired and create a history item for it
     * @param transition that was added 
     */
    void addHistoryItem(Transition transition);

    /**
     *
     * @return transition at current position in the firing sequence
     */
    Transition getCurrentTransition();

    /**
     *
     * @param index of the transition 
     * @return transition at this index in the firing sequence
     */
    Transition getTransition(int index);

    void clear();
}
