package inference.axioms;
import java.util.Map;

import inference.EquationAxiom;
import models.algebra.Variable;
import models.formulas.meta.MetaDependencyFormula;
import models.formulas.meta.MetaEquationFormula;
import models.terms.meta.MetaDependencyTerm;
import models.terms.meta.MetaDynamicDependency;
import models.terms.meta.MetaDynamicDependencyTerm;
import models.terms.meta.MetaEvaluatableTermVariable;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaTermGenerator;

public class MapComposition extends EquationAxiom {

	public MapComposition() {
		super("Map Composition");
		assumptions.add(
				new MetaDependencyFormula(
						new MetaDynamicDependency(
								(ci, cd, mi, md, context) -> ci - 2 == 0 ? new MetaEvaluatableTermVariable(new Variable("u")) : new MetaEvaluatableTermVariable(new Variable("u" + (ci - 2))),
								new MetaEvaluatableTermVariable(new Variable("s")),
								new MetaEvaluatableTermVariable(new Variable("t"))
						)
				)
		);
		assumptions.add(
				new MetaDependencyFormula(
						new MetaDynamicDependency(
								(ci, cd, mi, md, context) -> ci - 1 == 0 ? new MetaEvaluatableTermVariable(new Variable("v")) : new MetaEvaluatableTermVariable(new Variable("v" + (ci - 1))),
								new MetaEvaluatableTermVariable(new Variable("t"))
						)
				)
		);
		repetitionAssumptions.add(
				new MetaEquationFormula(
						new MetaDependencyTerm(
								 new MetaEvaluatableTermVariable(new Variable("v")),
								 new MetaEvaluatableTermVariable(new Variable("xxx")),
								 new MetaEvaluatableTermVariable(new Variable("yyy"))
						),
						 new MetaEvaluatableTermVariable(new Variable("x"))
				)		
		);
		
		conclusion = new MetaEquationFormula(
				new MetaDynamicDependencyTerm(
						new MetaTermGenerator() {
							@Override
							public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<String, Object> context) {
								curIndex -= 1;
								
								return null;
							}},
						new MetaEvaluatableTermVariable(new Variable("s")),
						new MetaEvaluatableTermVariable(new Variable("t"))
				),
				new MetaDynamicDependencyTerm(
						new MetaTermGenerator() {
							@Override
							public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<String, Object> context) {
								return null;
							}
						},
						new MetaEvaluatableTermVariable(new Variable("s"))
				)
		);
		
	}

}
