import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;

/** Klasse fuer einen Graphen, der aus Mengen von Knoten und Kanten besteht */
//mgraph1a
public class Graph {

  /** die Menge der Knoten des Graphen */
  protected HashSet<Vertex> vertices;
  /** die Menge der Kanten des Graphen */
  protected HashSet<Edge>   edges;

  /** Standardkonstruktor fuer einen leeren Graphen */
  public Graph() {
    vertices = new HashSet<Vertex>();
    edges = new HashSet<Edge>();
  }

  /** Eine Graphen aus den Mengen der Knoten und Kanten erzeugen.
   *  @param  vertices  Knotenmenge
   *  @param  edges     Kantenmenge
   */
  public Graph(HashSet<Vertex> vertices, HashSet<Edge> edges) {
    this.vertices = vertices;
    this.edges = edges;
  }

  @Override
  public String toString() {
    ArrayList<Vertex> temp = new ArrayList<>(this.vertices);
    Collections.sort(temp);
    StringBuilder erg = new StringBuilder();
    for (int i = 0; i < temp.size(); i++) {
      Vertex currentVertex = temp.get(i);
      erg.append(currentVertex.id + ":  ");
      for (int j = 0; j < temp.size(); j++) {
        Vertex maybeNeighbor = temp.get(j);
        Edge e = new Edge(currentVertex,maybeNeighbor);
        if (this.edges.contains(e)) {
          erg.append("1 ");
        } else {
          erg.append("0 ");
        }
      }
      erg.append("\n");
    }
    return erg.toString();
  }
//mgraph1e

  /** testen, ob Knoten in einer Menge funktionieren
    * @param  args  was dem Programmaufruf uebergeben wurde
    */
  public static void main(String[] args) {
    // erst mit 2 Knoten:
//mgraphmainvorgabea
    Vertex v2 = new Vertex(2);
    Vertex v1 = new Vertex(1);
    HashSet<Vertex> tempV = new HashSet<Vertex>();
    tempV.add(v2);
    tempV.add(v1);

    Edge e1 = new Edge(v1,v2);
    HashSet<Edge> tempE = new HashSet<Edge>();
    tempE.add(e1);

    Graph test = new Graph(tempV,tempE);
    System.out.println(test);
//mgraphmainvorgabee

    // nun mit einem 3. Knoten:
    Vertex v3 = new Vertex(3);
    Edge e2 = new Edge(v2,v3);
    Edge e3 = new Edge(v3,v1);
    test.vertices.add(v3);
    test.edges.add(e2);
    test.edges.add(e3);

    System.out.println(test);
  }

//mgraph2a
}
//mgraph2e

