import java.util.List;

import inference.rewrite.Position;
import inference.rewrite.ResourceTree;
import lombok.SneakyThrows;
import models.algebra.Expression;
import models.algebra.Type;
import models.dataConstraintModel.DataConstraintModel;
import models.dataFlowModel.DataTransferModel;
import models.terms.DependencyTerm;
import models.terms.Resource;
import parser.Parser;
import parser.Parser.TokenStream;

public class Main {

	static TokenStream stream = new Parser.TokenStream();
	static Parser parser = new Parser(stream);
	static DataTransferModel model = new DataTransferModel();
	
	static Type INT = DataConstraintModel.typeInt;

	public static void main(String[] args) {
		sandbox2();
	}
	
	static void sandbox1() {
		Resource A = new Resource("A",  INT, 1);
		Resource B = new Resource("B",  INT, 1);
		Resource C = new Resource("C",  INT, 1);
		Resource D = new Resource("D",  INT, 1);
		Resource E = new Resource("E",  INT, 1);
		Resource F = new Resource("F",  INT, 1);
		Resource G = new Resource("G",  INT, 1);
		DependencyTerm t1 = new DependencyTerm(A, B, C, D, E);
		DependencyTerm t2 = new DependencyTerm(t1, F, G);
		System.out.println(t2);
		ResourceTree rt = new ResourceTree(t2);
		System.out.println(rt);
		rt.debug(new Position(List.of(0)));
	}
	
	static void sandbox2() {
		Resource A = new Resource("A",  INT, 1);
		Resource B = new Resource("B",  INT, 1);
		Resource C = new Resource("C",  INT, 1);
		Resource D = new Resource("D",  INT, 1);
		Resource E = new Resource("E",  INT, 1);
		Resource F = new Resource("F",  INT, 1);
		Resource G = new Resource("G",  INT, 1);
		Resource H = new Resource("H",  INT, 1);
		Resource I = new Resource("I",  INT, 1);
		Resource J = new Resource("J",  INT, 1);
		Resource K = new Resource("K",  INT, 1);
		Resource L = new Resource("L",  INT, 1);
		Resource M = new Resource("M",  INT, 1);
		Resource N = new Resource("N",  INT, 1);
		Resource O = new Resource("O",  INT, 1);
		Resource P = new Resource("P",  INT, 1);
		Resource Q = new Resource("Q",  INT, 1);
		
		DependencyTerm t1 = new DependencyTerm(A, B, C, D, E);
		DependencyTerm t2 = new DependencyTerm(G, H, I, J, K);
		DependencyTerm t3 = new DependencyTerm(M, N, O, P, Q);
		DependencyTerm t4 = new DependencyTerm(t1, F, t2, L, t3);
		System.out.println(t4);
		ResourceTree rt = new ResourceTree(t4);
		System.out.println(rt);
		rt.debug(new Position());
		rt.debugAllPath();
		
	}
	
	
	static void sandbox7() {
		Resource A = new Resource("A",  INT, 1);
		Resource B = new Resource("B",  INT, 1);
		Resource C = new Resource("C",  INT, 1);
		Resource D = new Resource("D",  INT, 1);
		Resource E = new Resource("E",  INT, 1);
		Resource F = new Resource("F",  INT, 1);
		Resource G = new Resource("G",  INT, 1);
		Resource H = new Resource("H",  INT, 1);
		Resource I = new Resource("I",  INT, 1);
		Resource J = new Resource("J",  INT, 1);
		Resource K = new Resource("K",  INT, 1);
		Resource L = new Resource("L",  INT, 1);
		Resource M = new Resource("M",  INT, 1);
		Resource N = new Resource("N",  INT, 1);
		Resource O = new Resource("O",  INT, 1);
		
		DependencyTerm t1 = new DependencyTerm(A, B, C);
		DependencyTerm t2 = new DependencyTerm(I, J, K);
		DependencyTerm t3 = new DependencyTerm(M, N, O);
		DependencyTerm t4 = new DependencyTerm(E, F, G, H, t2);
		DependencyTerm t5 = new DependencyTerm(t1, D, t4, L, t3);
		
		ResourceTree rt = new ResourceTree(t5);
		System.out.println(rt);
		rt.debug(new Position(List.of(0)));
	}
	
	
	@SneakyThrows
	static Expression parse(String expr) {
		stream.addLine(expr);
		return parser.parseTerm(stream, model);
	}
	
	
}
