package cap19.grafo;

import IngressoUscita.Console;
import java.util.Iterator;

class NodoInfo extends Nodo
{ int info;
  NodoInfo(int info)
  { this.info = info;
  }
  public String toString()
  { return "" + info;
  }
  public boolean equals(Object o)
  { try
    { NodoInfo n = (NodoInfo) o;
      return info == n.info;
    }
    catch (Exception e) {}
    return false;
  }
}

class ArcoInfo extends Arco
{ ArcoInfo(NodoInfo s, NodoInfo d)
  { super(s, d);
  }
  public String toString()
  { NodoInfo s = (NodoInfo) sorgente();
    NodoInfo d = (NodoInfo) destinazione();
    return "(" + s + ", " + d + ")";
  }
  public boolean equals(Object o)
  { try
    { ArcoInfo a = (ArcoInfo) o;
      return sorgente().equals(a.sorgente()) &&
      destinazione().equals(a.destinazione());
    }
    catch (Exception e) {}
    return false;
  }
}

class Test
{ static void stampa(Grafo g)
  { Iterator<Nodo> i = g.dammiNodi();
    while (i.hasNext())
    { NodoInfo n = (NodoInfo) i.next();
      Console.scriviStringa("Nodo: " + n);
      Console.scriviStr("  Archi:");
      Iterator<Arco> j = n.archiUscenti();
      while (j.hasNext())
      { ArcoInfo a = (ArcoInfo) j.next();
        Console.scriviStr(" " + a);
      }
      Console.nuovaLinea();
      Console.scriviStr("  Adiacenze:");
      Iterator<Nodo> k = n.nodiAdiacenti();
      while (k.hasNext())
      { NodoInfo m = (NodoInfo) k.next();
        Console.scriviStr(" " + m);
      }
      Console.nuovaLinea();
    }
    Console.scriviStr("Archi:");
    Iterator<Arco> j = g.dammiArchi();
    while (j.hasNext())
    { ArcoInfo a = (ArcoInfo) j.next();
      Console.scriviStr(" " + a);
    }
    Console.nuovaLinea();
  }
  public static void main(String[] args)
  { Grafo g = new Grafo();
    for (;;)
    { stampa(g);
      Console.scriviStringa("1) aggiungi nodo");
      Console.scriviStringa("2) rimuovi nodo");
      Console.scriviStringa("3) aggiungi arco");
      Console.scriviStringa("4) rimuovi arco");
      Console.scriviStringa("5) fine");
      int in = Console.leggiIntero();
      boolean risu = true;
      switch (in)
      { case 1:
          NodoInfo n = new NodoInfo(Console.leggiIntero());
          risu = g.aggiungiNodo(n);
          break;
        case 2:
          risu = g.rimuoviNodo(
              new NodoInfo(Console.leggiIntero()));
          break;
        case 3:
          ArcoInfo a =
            new ArcoInfo(
              new NodoInfo(Console.leggiIntero()),
              new NodoInfo(Console.leggiIntero()));
          risu = g.aggiungiArco(a);
          break;
        case 4:
          risu = g.rimuoviArco(
              new ArcoInfo(
                new NodoInfo(Console.leggiIntero()),
                new NodoInfo(Console.leggiIntero())));
          break;
        case 5:
          return;
      }
      if (risu)
        Console.scriviStringa("OK");
      else
        Console.scriviStringa("Non eseguito");
    }
  }
}
