package pipe.historyActions.arc;


import uk.ac.imperial.pipe.models.petrinet.Connectable;
import uk.ac.imperial.pipe.models.petrinet.Arc;
import uk.ac.imperial.pipe.models.petrinet.ArcPoint;

import javax.swing.undo.AbstractUndoableEdit;

/**
 * Undo/Redo action for adding a point in an arcs path
 * @param <S> source
 * @param <T> target 
 */
@SuppressWarnings("serial")
public class AddArcPathPoint<S extends Connectable, T extends Connectable> extends AbstractUndoableEdit {
    /**
     * Arc model to add/remove the point to/from
     */
    private final Arc<S, T> arc;

    /**
     * Arc point
     */
    private final ArcPoint point;

    /**
     * Constructor
     * @param arc arc the point belongs to
     * @param point arc point
     */
    public AddArcPathPoint(Arc<S, T> arc, ArcPoint point) {
        this.arc = arc;
        this.point = point;
    }

    @Override
    public int hashCode() {
        int result = arc.hashCode();
        result = 31 * result + point.hashCode();
        return result;
    }

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final AddArcPathPoint that = (AddArcPathPoint) o;

        if (!arc.equals(that.arc)) {
            return false;
        }
        if (!point.equals(that.point)) {
            return false;
        }

        return true;
    }

    /**
     * Remove the point from the arc
     */
    @Override
    public final void undo() {
        super.undo();
        arc.removeIntermediatePoint(point);
    }

    /**
     * Adds the point to the arc
     */
    @Override
    public final void redo() {
        super.redo();
        arc.addIntermediatePoint(point);
    }

}
