package org.codecompany.plugins.intelliprof.diagram;

import com.intellij.openapi.graph.GraphManager;
import com.intellij.openapi.graph.geom.YPoint;
import com.intellij.openapi.graph.builder.util.GraphWrapperUtil;
import com.intellij.openapi.graph.base.Edge;
import com.intellij.openapi.graph.base.EdgeList;
import com.intellij.openapi.graph.base.Node;
import com.intellij.openapi.graph.layout.LayoutGraph;
import com.intellij.openapi.graph.layout.Layouter;
import com.intellij.openapi.graph.layout.EdgeLayout;
import com.intellij.openapi.project.Project;

public class DiagramLayouter implements Layouter {

    private double minimalNodeDistance = 40;
    private GraphManager manager;
    private Project project;

    public DiagramLayouter(Project project) {
        this.project = project;
        manager = GraphManager.getGraphManager();
    }

    public void setMinimalNodeDistance(double d) {
        minimalNodeDistance = d;
    }

    public double getMinimalNodeDistance() {
        return minimalNodeDistance;
    }

    public boolean canLayout(LayoutGraph graph) {
        return true;
    }

    public void doLayout(LayoutGraph graph) {

        Node nodes[] = graph.getNodeArray();
        Edge edges[] = graph.getEdgeArray();

        double offset = 0.0;
        for (Node n : nodes) {
            graph.setLocation(n, offset, 0);
            offset += minimalNodeDistance + Math.max(graph.getWidth(n), graph.getHeight(n));

            //UMLClassInstance node =
            //        GraphWrapperUtil.getInstance(project).getNodeObject(graph, n);

            //double centerX = graph.getCenterX(n);
            //double centerY = graph.getCenterY(n);
            //double width = graph.getWidth(n);
            //double height = graph.getHeight(n);
        }

        for (Edge e : edges) {
            UMLLine edge = GraphWrapperUtil.getInstance(project).getEdgeObject(graph, e);

            UMLClassInstance source = edge.getSource();
            UMLClassInstance target = edge.getTarget();

            Node sourceNode = GraphWrapperUtil.getInstance(project).getNode(graph, source);
            Node targetNode = GraphWrapperUtil.getInstance(project).getNode(graph, target);

            //life line
            if (sourceNode == targetNode) {
                double centerY = graph.getCenterY(sourceNode);
                double startX = graph.getCenterX(sourceNode);
                double startY = (graph.getHeight(sourceNode) / 2) - centerY;
                YPoint start = manager.createYPoint(startX, startY);

                double finishY = startY + 200;
                YPoint finish = manager.createYPoint(startX, finishY);

                graph.setSourcePointAbs(e, start);
                graph.setTargetPointAbs(e, finish);
            }
        }
    }
}
