import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;
import org.w3c.dom.Node;

import us.jubat.graph.*;

class Station_join {
	String station1;
	String station2;
}

public class Create {
	public static final String HOST = "127.0.0.1";
	public static final int PORT = 9199;
	public static final String instance_name="";
	
	public static Map<String,String> stations = new HashMap<String,String>();
	
	
	public static Map<Integer, Station_join> get_station_join(int line_cd) {
		Map<Integer, Station_join> station_join = new HashMap<Integer,Station_join>();
		
		try {
			String urlString = "http://www.ekidata.jp/api/n/"+line_cd+".xml";
			URL url = new URL(urlString);
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document dom = db.parse(url.openStream());
			NodeList join_nodeList = dom.getElementsByTagName("station_join");
			for(int i=0; i < join_nodeList.getLength(); i++){
				Station_join join_list = new Station_join();
				NodeList join_children = join_nodeList.item(i).getChildNodes();
				for(int j=0; j < join_children.getLength(); j++){
					Node node = join_children.item(j);
					String name = node.getNodeName();
					String value1 = join_children.item(5).getTextContent();
					String value2 = join_children.item(7).getTextContent();
					if(name == "station_name1"){
						join_list.station1 = value1;
					}else if(name == "station_name2"){
						join_list.station2 = value2;
					}
				}
				station_join.put(i, join_list);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return station_join;
	}
	
	public static void create_graph(GraphClient c, Map<Integer, Station_join> station_join) throws Exception {
		
		for(int i=0; i<station_join.size(); i++) {
			String s1_node_id = add_station(c, station_join.get(i).station1);
			String s2_node_id = add_station(c, station_join.get(i).station2);
	
			Map<String,String> propety = new HashMap<String,String>();
			
			Edge edge_1 = new Edge(new HashMap<String,String>(), s1_node_id, s2_node_id);
			Edge edge_2 = new Edge(new HashMap<String,String>(), s2_node_id, s1_node_id);
			c.createEdge(s1_node_id, edge_1);
			c.createEdge(s2_node_id, edge_2);
			
			c.updateIndex();
		}
	}
	
	public static String add_station(GraphClient c, String name) throws Exception {
		String node_id;
		
		if(stations.containsKey(name)){
			node_id = stations.get(name);
		}else {
			node_id = c.createNode();
			Map<String,String> name_map = new HashMap<String,String>();
			name_map.put("name", name);
			c.updateNode(node_id, name_map);
			stations.put(name, node_id);
		}
		return node_id;
	}
	
	public static void print_station() throws Exception {
		TreeMap<Integer,String> tm = new TreeMap<Integer,String>();
		for(String station: stations.keySet()){
			tm.put(Integer.parseInt(stations.get(station)), station);
		}
		System.out.println("=== Station IDs ===");
		for(int id: tm.keySet()){
			System.out.println(id+"\t"+tm.get(id));
		}
		return;
	}
	
	public static void main(String[] args) throws Exception {
		GraphClient client = new GraphClient(HOST, PORT, instance_name, 10);
		PresetQuery pq = new PresetQuery();
		client.addShortestPathQuery(pq);
		
		create_graph(client, get_station_join(32001));
		create_graph(client, get_station_join(11623));
		
		print_station();
		System.exit(0);
	}
}
/*
create_graph(client, get_station_join(11302));
create_graph(client, get_station_join(11312));

create_graph(client, get_station_join(11602));
create_graph(client, get_station_join(11601));
create_graph(client, get_station_join(11503));
create_graph(client, get_station_join(11502));
create_graph(client, get_station_join(11501));
create_graph(client, get_station_join(11301));
*/