package gps;

import java.util.LinkedList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/* lecture du fichier XML (avec SAX)
 *   le principe est de donner du code qui est appelé
 *   quand une balise est ouverte (startElement)
 *   et quand elle est fermée (endElement)
 */

class XMLHandler extends DefaultHandler {

  private String wayName = null;
  private boolean oneway = false;
  private LinkedList<Vertex> way = null;

  @Override
  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException {
    if (qName.equals("node")) {
      int id = Integer.parseInt(attributes.getValue("id"));
      double lat = Double.parseDouble(attributes.getValue("lat"));
      double lon = Double.parseDouble(attributes.getValue("lon"));
      Vertex.create(id, lat, lon);
    } else if (qName.equals("way")) {
      way = new LinkedList<Vertex>();
    } else if (qName.equals("nd") && way != null) {
      int ref = Integer.parseInt(attributes.getValue("ref"));
      Vertex p = Vertex.fromId(ref);
      if (p != null)
        way.add(p);
    } else if (qName.equals("tag") && way != null) {
    	String k = attributes.getValue("k");
      if (k.equals("name"))
        wayName = attributes.getValue("v");
      if (k.equals("oneway"))
        oneway = attributes.getValue("v").equals("yes");
      if (k.equals("waterway"))
        way = null;
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    if (qName.equals("way") && way != null && way.size() > 1) {
      Vertex v = way.removeFirst();
      for (Vertex w : way) {
        Graph.addEdge(new Edge(v, w, wayName, oneway));
        if (!oneway)
          Graph.addEdge(new Edge(w, v, wayName, oneway));
        v = w;
      }
      way = null;
      wayName = null;
      oneway = false;
    }
  }
}