package designPatternExtensions;

//メモ
//https://github.com/iluwatar/java-design-patterns/tree/master/visitor
//Commander->Sergent(Children) 1:多の転送ができないため不可能
//制御の委譲をできるようにする必要がある（自分の作業）

import models.objectOrientedTransfer.*;

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

public class Visitor {

    public static DataTransferDesign create() throws IllegalRelationException {
        List<ReferenceEdge> srcEdges = new ArrayList<>();
        List<ReferenceEdge> dstEdges = new ArrayList<>();
        ObjectNode commander = new ObjectNode("Commander");
        ObjectNode sergent = new ObjectNode("Sergent");
        ObjectNode soldier = new ObjectNode("Soldier");
        ObjectNode client = new ObjectNode("Client");
        ObjectNode main = new ObjectNode("Main");
        ObjectNode visitor   = new ObjectNode("SoldierVisitor");

        ReferenceEdge srcEdge = new ReferenceEdge(commander, sergent, "children", "Integer");
        srcEdges.add(srcEdge);
        srcEdge = new ReferenceEdge(sergent, soldier, "children", "Integer");
        srcEdges.add(srcEdge);
        ReferenceEdge dstEdge = new ReferenceEdge(main, client, "client");
        dstEdges.add(dstEdge);

        Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne);
        DataTransferContext context = new DataTransferContext(
                new ArrayList<>(), transferRelation, visitor, "visitor", PushPullValue.PULL
        );

        DataTransferDesign design = new DataTransferDesign(context);

        DependencyInversion di = new DependencyInversion(
                visitor, new InterfaceNode(visitor, "UnitVisitor"), commander
        );
        design.addDependencyInversion(di);

        return design;
    }
}