package models.deltaAlgebra;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class PrimitivePullPushDelta extends PrimitiveDelta {
	private ReferenceEdge pullEdge = null;
	private ReferenceEdge pushEdge = null;

	public PrimitivePullPushDelta(ReferenceEdge pullEdge, ReferenceEdge pushEdge, String dataName) {
		super(dataName);
		this.pullEdge = pullEdge;
		this.pushEdge = pushEdge;
	}

	@Override
	public ObjectNode getCoordinator() {
		return (ObjectNode) pushEdge.getSource();
	}

	@Override
	public List<ReferenceEdge> getPullEdges() {
		List<ReferenceEdge> pullEdges = new ArrayList<>();
		pullEdges.add(pullEdge);
		return pullEdges;
	}

	@Override
	public List<ReferenceEdge> getPushEdges() {
		List<ReferenceEdge> pushEdges = new ArrayList<>();
		pushEdges.add(pushEdge);
		return pushEdges;
	}

	@Override
	public ReferenceEdge getDefinedEdge() {
		return new ReferenceEdge((ObjectNode) pushEdge.getDestination(), (ObjectNode) pullEdge.getDestination(), dataName, pullEdge.getMultiplicity());
	}

	@Override
	public ObjectNode getDataType() {
		return (ObjectNode) pullEdge.getDestination();
	}

	public ReferenceEdge getPullEdge() {
		return pullEdge;
	}

	public ReferenceEdge getPushEdge() {
		return pushEdge;
	}

	@Override
	public PrimitivePullPushDelta copy() {
		return new PrimitivePullPushDelta(pullEdge, pushEdge, dataName);
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || !(o instanceof PrimitivePullPushDelta)) return false;
		PrimitivePullPushDelta another = (PrimitivePullPushDelta) o;
		return pullEdge.equals(another.pullEdge) && pushEdge.equals(another.pushEdge);
	}

	@Override
	public int hashCode() {
		return Objects.hash(pullEdge.hashCode(), pushEdge.hashCode());
	}
}
