// Datei: TelefonbuchServer.java
// Autor: Werner Brecht
// Datum: 23.07.2018
// Thema: Ein TelefonbuchServer mit einer Benutzerschnittstelle
//        und einer Analysemethode.
//
//        Die Benutzerschnittstelle besteht aus den beiden
//        Methoden auswahl() und ausgabe(). Die Analysemethode
//        heißt analyse().
//
//        Eine Beschreibung der Arbeitsweise des Servers findet
//        sich im Grobentwurf des Lösungsbeispiels zur
//        Aufgabe 1.
// =============================================================
import java.util.*;
import java.io.*;
import java.util.regex.*;
class TelefonbuchServer {
  public static void main(String[] unused) throws Exception {
    // Ergebnisliste bereitstellen
    // ---------------------------------------------------------
    ArrayList<String> erg = null;
    String qs = null;
    // Benutzer abfragen, Eingaben untersuchen, ggf. Suchvor-
    // gänge starten und Ergebnis ausgeben. Abbruch auf
    // Benutzerwunsch in auswahl()
    // ---------------------------------------------------------
    while(true) {
      qs = auswahl();
      erg = analyse(qs);
      ausgabe(erg);
    }
  } // main()
// =============================================================
  static String auswahl() throws Exception {
    // Das Programm arbeitet mit einer Windows-Konsole, weshalb
    // als Zeichenkodierung Cp850 eingestellt wird
    // ---------------------------------------------------------
    BufferedReader br = new BufferedReader(
                     new InputStreamReader(System.in, "Cp850"));
    PrintStream ps = new PrintStream(System.out, true, "Cp850");
    String ein = null;
    while(true) {
      ps.println("\nTelefonbuchabfrage");
      ps.println("------------------");
      ps.println("Sie können durch Eingabe der Ziffer");
      ps.println("  1 : nach einem Namen,");
      ps.println("  2 : nach einer Nummer,");
      ps.println("  3 : nach einem Namen und einer " +
                                      "Nummer suchen oder mit");
      ps.println("  4 : das Programm beenden.\n");
      ps.print("Ihre Eingabe ->");
      ein = br.readLine().trim();
      // Je nach Eingabe des Benutzers:
      // -------------------------------------------------------
      String sna = 
        "Geben Sie jetzt bitte einen Namen ein und achten" +
        "\nSie darauf, dass er kein Kaufmanns-Und (&) " +
        "enthält.";
      String snu =
        "Geben Sie jetzt bitte eine Nummer ein und achten"  +
        "\nSie darauf, dass sie kein Kaufmanns-Und (&) " +
        "enthält.";
      if(ein.equals("1")) {
         ps.println("\n" + sna);
         ps.print("\nIhre Eingabe ->");
         ein = br.readLine().trim();
         ein = ein + "&";                        // Query String
         break;
      }
      if(ein.equals("2")) {
         ps.println("\n" + snu);
         ps.print("\nIhre Eingabe ->");
         ein = br.readLine().trim();
         ein = "&" + ein;                        // Query String
         break;
      }
      if(ein.equals("3")) {
         ps.println("\n" + sna);
         ps.print("\nIhre Eingabe ->");
         ein = br.readLine().trim();
         ein = ein + "&";                 // Query String Anfang
         ps.println("\n" + snu);
         ps.print("\nIhre Eingabe ->");
         ein = ein + br.readLine().trim();  // Query String Rest
         break;
      }
      if(ein.equals("4") ) {
         ps.println("\n============================");
         ps.println("Benutzerwunsch: Programmende");
         ps.println("============================\n");
         System.exit(0);
      }
      ps.println("\n===================");
      ps.println("Unzulässige Auswahl");
      ps.println("Bitte wiederholen");
      ps.println("===================\n");
      continue;
    } // while
    return ein;                                  // Query String
  } // auswahl()
// =============================================================
  static ArrayList<String> analyse(String qs) throws Exception {
    // Telefonbuch erzeugen und Ergebnisliste anlegen
    // ---------------------------------------------------------
    Telefonbuch tb = new Telefonbuch();
    ArrayList<String> erg = new ArrayList<String>();
    // Ergebnislisten im Telefonbuch löschen
    // ---------------------------------------------------------
    tb.suErgNa.clear();
    tb.suErgNu.clear();
    // Ist in den Eingaben genau ein & enthalten?
    // ---------------------------------------------------------
    String regex = "^[^&]*&[^&]*$";
    if(! qs.matches(regex)) {
      erg.add("Syntaxfehler");
      return erg;
    }
    // Sind die Benutzereingaben leer?
    // ---------------------------------------------------------
    if(qs.equals("&")) {
      erg.add("Leere Eingabe");
      return erg;
    }
    // Der Query String ist korrekt aufgebaut
    // ---------------------------------------------------------
    erg = tb.tBuchAbfrage(qs);
    erg.add("Suche");
    return erg;
  }
// =============================================================
  static void ausgabe(ArrayList<String> erg) throws Exception {
    // Die Ausgaben gehen in eine Windows-Konsole, deshalb Cp850
    // ---------------------------------------------------------
    PrintStream ps = new PrintStream(System.out, true, "Cp850");
    int len = erg.size();
    String analyseErg = erg.get(len-1);
    ps.println("\n========================================");
    if(analyseErg.equals("Syntaxfehler")) {
      ps.println("Syntaktisch falsche Eingabe");
      ps.println("Bitte wiederholen");
      ps.println("========================================\n");
      return;
    }
    if(analyseErg.equals("Leere Eingabe")) {
      ps.println("Leere Eingabe");
      ps.println("Bitte wiederholen");
      ps.println("========================================\n");
      return;
    }
    ps.println("Suchergebnis:\n");
    // War die Suche ergebnislos?
    // ---------------------------------------------------------
    if(len == 1) {
      ps.println("Die Suche war ergebnislos");
      ps.println("========================================\n");
      return;
    }
    String[] token = null;
    for(int i=0; i<len-1; i++) {
      token = erg.get(i).split("&");
      ps.println("\t" + token[0] + "\t\t" + token[1]);
    }
    ps.println("========================================\n");
    return;
  } // ausgabe()
} // class