package models.terms;

import lombok.Getter;
import models.algebra.Symbol;

@Getter
public class SetEvaluatableTerm extends EvaluatableTerm{

	private EvaluatableTerm term;
	
	public SetEvaluatableTerm(EvaluatableTerm term) {
		super(new Symbol("", 1), term.getOrder() - 1);
		this.term = term;
		this.addChild(term);
	}
	
	public SetEvaluatableTerm(EvaluatableTerm term, int order) {
		super(new Symbol("", 1), order);
		if(term.getOrder() > order + 1) {
			var childTerm = new SetEvaluatableTerm(term, order+1); 
			this.term = childTerm;
			this.addChild(childTerm);
		} else {
			this.term = term;
			this.addChild(term);
		}
	}
	
	public void setTerm(EvaluatableTerm newTerm) {
		setChild(0, newTerm);
		this.term = newTerm;
	}
	
	@Override
	public EvaluatableTerm linearRightNormalize() {
		return (SetEvaluatableTerm) clone();
	}

	@Override
	public void selfLinearRightNormalize() {
	}
	
	@Override
	public boolean isLinearRightNormal() {
		return term.isLinearRightNormal();
	}

	
	@Override
	public boolean equals(Object another) {
		if(! (another instanceof SetEvaluatableTerm)) {
			return false;
		}
		var term = (SetEvaluatableTerm) another;
		return term.getTerm().equals(getTerm());
	}

	@Override
	public int hashCode() {
		return ("SET" + toString()).hashCode();
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append('{');
		sb.append(term.toString());
		sb.append('}');
		return sb.toString();
	}
	
	@Override
	public String toStringWithOrder() {
		StringBuilder sb = new StringBuilder();
		sb.append('{');
		sb.append(term.toStringWithOrder());
		sb.append('}');
		return sb.toString() + "(" + order + ")";
	}

	@Override
	public Object clone() {
		return new SetEvaluatableTerm((EvaluatableTerm) term.clone(), order);
	}

}
