import java.util.ArrayList;
import java.util.List;

import designPatternExtensions.*;
import designPatternExtensions.designPattern.*;
import generators.ASTGenerator;
import models.deltaAlgebra.MultiplicityValue;
import models.deltaAlgebra.ObjectNode;
import models.deltaAlgebra.ReferenceEdge;
import models.dataSynchronizationModel.*;

public class Main {

    public static void main(String[] args) {
        List<ReferenceEdge> srcEdges = new ArrayList<>();
        List<ReferenceEdge> dstEdges = new ArrayList<>();
        ObjectNode companies = new ObjectNode("Companies");
        ObjectNode company = new ObjectNode("Company");
        ObjectNode customers = new ObjectNode("Customers");
        ObjectNode customer = new ObjectNode("Customer");
        ObjectNode string = new ObjectNode("String");
        ReferenceEdge srcEdge = new ReferenceEdge(companies, company, "company", "String");
		ReferenceEdge srcEdge2 = new ReferenceEdge(company, string, "address");
		srcEdges.add(srcEdge);
		srcEdges.add(srcEdge2);
        ReferenceEdge dstEdge = new ReferenceEdge(customers, customer, "customer", "String");
		ReferenceEdge dstEdge2 = new ReferenceEdge(customer, string, "address");
        dstEdges.add(dstEdge);
		dstEdges.add(dstEdge2);
        List<Relation> relations = new ArrayList<>();
//		Relation transferRelation = new Relation(company, customer, MultiplicityValue.OneToOne);
		Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToMany);
		DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PUSH);
		
		DataSynchronizationDesign design;
		try {
			design = new DataSynchronizationDesign(context);

//			ObjectNode cm = new ObjectNode("CompanyMediator");
//			MediatorInsertion mi = new MediatorInsertion(customer, company, cm, context);
//			design.addMediatorInsertion(mi);
//
//			DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer);
//			design.addDependencyInversion(di);

			design = new Flyweight().create();

			System.out.println(design.getDeltaComplex());
			System.out.println(ASTGenerator.generate(design));
		} catch (IllegalRelationException e) {
			e.printStackTrace();
		}
		
	}

}
