package models.deltaAlgebra;

import models.Edge;

import java.util.Objects;

public class ReferenceEdge extends Edge {
	protected String name;
	protected MultiplicityValue multiplicity;
	protected String keyTypeName = null;

	public ReferenceEdge(ObjectNode src, ObjectNode dst, String name) {
		super(src, dst);
		this.name = name;
		this.multiplicity = MultiplicityValue.OneToOne;
	}

	public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, MultiplicityValue multiplicity) {
		super(src, dst);
		this.name = name;
		this.multiplicity = multiplicity;
	}

	public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, String keyTypeName) {
		super(src, dst);
		this.name = name;
		this.multiplicity = MultiplicityValue.OneToMany;
		this.keyTypeName = keyTypeName;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public MultiplicityValue getMultiplicity() {
		return multiplicity;
	}

	public void setMultiplicity(MultiplicityValue multiplicity) {
		this.multiplicity = multiplicity;
	}

	public boolean toMany() {
		return multiplicity == MultiplicityValue.OneToMany || multiplicity == MultiplicityValue.ManyToMany;
	}

	public String getKeyTypeName() {
		return keyTypeName;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || !(o instanceof ReferenceEdge)) return false;
		ReferenceEdge another = (ReferenceEdge) o;
		if (!(another.getSource() instanceof ObjectNode) || !(another.getDestination() instanceof ObjectNode))
			return false;
		ObjectNode src = (ObjectNode) another.getSource();
		ObjectNode dst = (ObjectNode) another.getDestination();
		return name.equals(another.name) && ((ObjectNode) source).getName().equals(src.getName()) && ((ObjectNode) destination).getName().equals(dst.getName());
	}

	@Override
	public int hashCode() {
		return Objects.hash(name.hashCode(), ((ObjectNode) source).getName().hashCode(), ((ObjectNode) destination).getName().hashCode());
	}
}