package gps;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/* le graphe est représenté par des listes d'adjacence
 * 
 */

class Graph {
  private static final Map<Vertex, List<Edge>> adj =
      new HashMap<Vertex, List<Edge>>();
  private static int edges = 0;

  static void addEdge(Edge e) {
    List<Edge> l = adj.get(e.src);
    if (l == null)
      adj.put(e.src, l = new LinkedList<Edge>());
    l.add(e);
    edges++;
  }

  static Iterable<Edge> successors(Vertex p) {
    List<Edge> l = adj.get(p);
    if (l == null)
      return new LinkedList<Edge>();
    return l;
  }

  static Iterable<Vertex> vertices() {
    return adj.keySet();
  }

  static Iterable<List<Edge>> edges() {
    return adj.values();
  }

  // renvoie le sommet le plus proche du point de coordonnées (lat,lon)
  static Vertex closest(double lat, double lon) {
    Vertex v = new Vertex(lat, lon), best = null;
    double bestDist = Double.MAX_VALUE;
    for (Vertex w : adj.keySet()) {
      double dist = v.distance(w);
      if (dist < bestDist) {
        bestDist = dist;
        best = w;
      }
    }
    System.out.println("distance = " + bestDist);
    return best;
  }

  static void stat() {
    System.out.println(adj.size() + " nodes");
    System.out.println(edges + " edges");
  }

}