package models.terms.meta;
import java.util.HashMap;
import java.util.Map;

import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import models.algebra.Variable;
import models.terms.RDLTerm;

@RequiredArgsConstructor
@EqualsAndHashCode
@ToString
public class MatchConstraint {

	private final Map<Variable, RDLTerm> binding;
	private final Map<Variable, OrderVariableConstraint> orderConstraint;
	
	public MatchConstraint(MatchConstraint constraint) {
		this.binding = constraint.getBinding();
		this.orderConstraint = constraint.getOrderConstraint();
	}
	
	public Map<Variable, RDLTerm> getBinding() {
		return new HashMap<>(binding);
	}
	
	public void setBinding(Variable key, RDLTerm value) {
		this.binding.put(key, value);
	}
	
	public Map<Variable, OrderVariableConstraint> getOrderConstraint() {
		Map<Variable, OrderVariableConstraint> res = new HashMap<>();
		for (var key : orderConstraint.keySet()) {
			res.put(key, (OrderVariableConstraint) orderConstraint.get(key).clone());
		}
		return res;
	}
	
	public void putOrderConstraint(Variable key, OrderVariableConstraint value) {
		this.orderConstraint.put(key, value);
	}
	
	public void setOrderConstraint(Variable key, OrderConstraint constraint, int value) {
		this.orderConstraint.get(key).setConstraint(value, constraint);
	}
	
	public static MatchConstraint createDefault() {
		return new MatchConstraint(new HashMap<>(), new HashMap<>());
	}
	
}
