package models;

import lombok.Getter;

@Getter
public class Dependency extends RDLTerm{
	
	private RDLTerm dependingTerm;
	private ResourceVariable dependedVariable;
	private Dependency dependency;
	
	public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable) {
		super(dependedVariable.getOrder());
		this.dependingTerm = dependingTerm;
		this.dependedVariable = dependedVariable;
		this.dependency = null;
		this.addChild(dependingTerm);
		this.addChild(dependedVariable);
	}
	
	public Dependency(Dependency dependency) {
		super(dependency.getOrder() - 1);
		this.dependency = dependency;
		this.dependingTerm = null;
		this.dependedVariable = null;
		this.addChild(dependency);
	}
	
	public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable, int order) {
		super(order);
		if(order == dependedVariable.order) {
			this.dependingTerm = dependingTerm;
			this.dependedVariable = dependedVariable;
			this.addChild(dependingTerm);
			this.addChild(dependedVariable);
			this.dependency = null;
		} else {
			this.dependency = new Dependency(dependingTerm, dependedVariable, order+1);
			this.dependingTerm = null;
			this.dependedVariable = null;
			this.addChild(dependency);
		}
	}
	
	public Dependency getDependency() {
		return this.dependency;
	}
	
	@Override
	public int getTermOrder() {
		return getOrder() - 1;
	}
	
	
	
	@Override
	public String toStr() {
		StringBuilder sb = new StringBuilder();
		if(dependency == null) {
			sb.append(dependingTerm.toStr());
			sb.append(" : ");
			sb.append(dependedVariable.toStr());
		} else {
			sb.append('[');
			sb.append(dependency.toStr());
			sb.append(']');
		}
		return sb.toString();
	}
	
	@Override
	public String toStrWithOrder() {
		StringBuilder sb = new StringBuilder();
		if(dependency == null) {
			sb.append(dependingTerm.toStrWithOrder());
			sb.append(" : ");
			sb.append(dependedVariable.toStrWithOrder());
		} else {
			sb.append('[');
			sb.append(dependency.toStrWithOrder());
			sb.append(']');
		}
		return sb.toString() + "(" + order + ")";
	}
	
	@Override
	public String toTermStr() {
		return "[" + toStr() + "]";
	}

	@Override
	public Object clone() {
		return new Dependency((RDLTerm) dependingTerm.clone(), (ResourceVariable) dependedVariable.clone());
	}

}
