package com.tinkerpop.blueprints.impls.ramcloud;

import java.awt.Dimension;
import java.util.logging.Level;

import javax.swing.JFrame;

import org.apache.commons.collections15.Transformer;

import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.oupls.jung.GraphJung;

import edu.uci.ics.jung.algorithms.layout.BalloonLayout;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.DAGLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout2;
import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.KKLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.scoring.PageRank;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;

public class JUNGExamples {

  public JUNGExamples() {
    // TODO Auto-generated constructor stub
  }
  
  public static void calculatePageRank(Graph graph) {
    PageRank<Vertex,Edge> pageRank = new PageRank<Vertex, Edge>(new GraphJung(graph), 0.15d);
    pageRank.evaluate();
    
    for (Vertex vertex : graph.getVertices()) {
      System.out.println("The PageRank score of " + vertex + " is: " + pageRank.getVertexScore(vertex));
    }
  }

  public static void displayGraph(Graph graph) {
    GraphJung gj = new GraphJung(graph);
    
    Layout<Vertex, Edge> layout = new CircleLayout<Vertex, Edge>(gj);
    layout.setSize(new Dimension(600, 600));
    BasicVisualizationServer<Vertex, Edge> viz = new BasicVisualizationServer<Vertex, Edge>(layout);
    viz.setPreferredSize(new Dimension(650, 650));

    Transformer<Vertex, String> vertexLabelTransformer = new Transformer<Vertex, String>() {
      public String transform(Vertex vertex) {
        return (String) vertex.getProperty("name");
      }
    };

    Transformer<Edge, String> edgeLabelTransformer = new Transformer<Edge, String>() {
      public String transform(Edge edge) {
        return edge.getLabel();
      }
    };

    viz.getRenderContext().setEdgeLabelTransformer(edgeLabelTransformer);
    viz.getRenderContext().setVertexLabelTransformer(vertexLabelTransformer);

    JFrame frame = new JFrame("TinkerPop");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(viz);
    frame.pack();
    frame.setVisible(true);
    
    try {
      System.in.read();
    } catch(Exception e) {
      // poop
    }
  }
  
  public static void main(String[] args) {
    Graph graph = new RamCloudGraph(Level.FINER);
    
    FurnaceExamples.generateDistributionGraph(graph, "ex");
    
    //calculatePageRank(graph);
    
    displayGraph(graph);
    
    graph.shutdown();
  }

}
