package models.objectOrientedTransfer;

import models.deltaAlgebra.MultiplicityValue;
import models.deltaAlgebra.ObjectNode;
import models.deltaAlgebra.ReferenceEdge;

import java.util.List;

public class Relation {
	private ObjectHierarchy srcObjectHierarchy;
	private ObjectHierarchy dstObjectHierarchy;
	private MultiplicityValue multiplicity;
	private boolean isFlat = false;

	public Relation(List<ReferenceEdge> srcObjectHierarchy, List<ReferenceEdge> dstObjectHierarchy, MultiplicityValue multiplicity) {
		isFlat = false;
		this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy);
		this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy);
		this.multiplicity = multiplicity;
	}

	public Relation(ObjectNode srcObjectNode, List<ReferenceEdge> dstObjectHierarchy, MultiplicityValue multiplicity) {
		isFlat = false;
		this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode);
		this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy);
		this.multiplicity = multiplicity;
	}

	public Relation(List<ReferenceEdge> srcObjectHierarchy, ObjectNode dstObjectNode, MultiplicityValue multiplicity) {
		isFlat = false;
		this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy);
		this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode);
		this.multiplicity = multiplicity;
	}

	public Relation(ObjectNode srcObjectNode, ObjectNode dstObjectNode, MultiplicityValue multiplicity) {
		this.isFlat = true;
		this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode);
		this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode);
		this.multiplicity = multiplicity;
	}
	
	public boolean isFlat() {
		return isFlat;
	}

	public ObjectHierarchy getSrcObjectHierarchy() {
		return srcObjectHierarchy;
	}

	public ObjectHierarchy getDstObjectHierarchy() {
		return dstObjectHierarchy;
	}

	public ObjectNode getSrcTopObject() {
		return srcObjectHierarchy.getTop();
	}

	public ObjectNode getDstTopObject() {
		return dstObjectHierarchy.getTop();
	}

	public MultiplicityValue getMultiplicity() {
		return multiplicity;
	}
}
