import java.io.*;
import java.awt.*;
import java.awt.event.*;

class Rollertel {
  // Kunden- und Auftragsverwaltung der Firma "Rollertel"

  Kunde k1 = new Kunde("Leonore Löper", "Lachendorf", 0.10);
  Kunde k2 = new Kunde("Norbert Nolde", "Nienhagen",  0.00);
  Kunde k3 = new Kunde("Roberta Rumpp", "Rehlingen",  0.05);

  Kunde[] KListe = {k1, k2, k3};

  Ware w1 = new Ware("Vierroller",  "Salomon",  250,  5);
  Ware w2 = new Ware("Fünfroller",  "Verducci", 450,  2);
  Ware w3 = new Ware("Knieschutz",  "Salomon",   45,  9);
  Ware w4 = new Ware("Helm",        "Fila",     180,  7);
  Ware w5 = new Ware("Kraftriegel", "Greif",      5, 30);

  Ware[] WListe = {w1, w2, w3, w4, w5};

  Ware[] waren1 = {w1, w3, w5};
  Bestellung a1 = new Bestellung(k1, waren1, "11.10.01", true);
  Ware[] waren2 = {w2, w3};
  Bestellung a2 = new Bestellung(k2, waren2, "12.10.01", false);
  Ware[] waren3 = {w4, w5};
  Bestellung a3 = new Bestellung(k1, waren3, "15.10.01", true);
  Ware[] waren4 = {w1, w3, w5};
  Bestellung a4 = new Bestellung(k3, waren4, "17.10.01", true);

  Bestellung[] BListe = {a1, a2, a3, a4};

  Bestellung[] aufträge1 = {a1, a3};
  Rechnung r1 = new Rechnung(k1, aufträge1, "20.10.01", true);
  Bestellung[] aufträge2 = {a4};
  Rechnung r2 = new Rechnung(k3, aufträge2, "21.10.01", false);

  Rechnung[] RListe = {r1, r2};

  String Kundendarstellung() {
    // Darstellung des Kundenstamms
    String text = "";
    for (int i = 0; i < KListe.length; i = i + 1) 
      text = text + KListe[i].Beschreibung();
    return text + "\n" + Kunde.Anzahl() + " Kunden insgesamt\n";
    } // Ende Kundendarstellung

  String Warendarstellung() {
    // Darstellung des Warenlagers
    String text = "";
    for (int i = 0; i < WListe.length; i = i + 1) 
      text = text + WListe[i].Beschreibung2();
    return text + "\nWert des Warenlagers: " 
                + Ware.Gesamtwert() + " EUR\n";
    } // Ende Warendarstellung

  } // Ende Rollertel

class RollertelTF extends Rollertel {
  // Benutzerschnittstelle als Textfenster (TF)
  
  InputStreamReader lies = new InputStreamReader(System.in);
  BufferedReader    eing = new BufferedReader(lies);

  void anzeige() {  
    System.out.println("\nAuftragsverwaltung der Firma Rollertel");
    System.out.println("--------------------------------------");
    char taste = ' ';
    while(taste != 'e') try {
      System.out.print("\nK(unden W(aren B(estellungen ");
      System.out.println("A(ussenstände E(nde");
      System.out.print("Wählen Sie! ");
      taste = eing.readLine().toLowerCase().charAt(0);
      switch(taste) {
        case 'e': 
          System.out.print("\nProgramm RollertelTF beendet. ");
          System.out.println("Auf Wiedersehen.");
          break;
        case 'k': 
          System.out.println("\n" + Kundendarstellung()); 
          break;
        case 'w': 
          System.out.println("\n" + Warendarstellung()); 
          break;
        case 'b': 
          zeigeBestellungen(); 
          break;
        case 'a': 
          zeigeAußenstände(); 
          break;
        } // Ende switch  
      } // Ende try
      catch(IOException e) {}  
    } // Ende anzeige

  void zeigeBestellungen() {
    System.out.println();
    for (int i = 0; i < KListe.length; i = i + 1) 
      System.out.println(BListe[i].Beschreibung());
    } // Ende zeige Bestellungen

  void zeigeAußenstände() {
    System.out.println();
    for (int i = 0; i < RListe.length; i = i + 1) {
      Rechnung rechnung = RListe[i];
      if (! rechnung.Bezahlt())
        System.out.println(rechnung.Beschreibung());
      } // Ende for
    System.out.println("\nWert aller Aussenstände: " + 
                          Rechnung.Außenstände() + " EUR");
    } // Ende zeige Außenstände

  static void main (String[] xy) {
    RollertelTF firma = new RollertelTF();
    firma.anzeige();
    } // Ende main

  } // Ende RollertelTF

class RollertelGO extends Rollertel {
  // Benutzerschnittstelle als grafische Oberfläche (GO)

  Frame    kundenfenster, warenfenster;
  TextArea textbereich1, textbereich2;

  RollertelGO() {
    kundenfenster = new Frame();
    kundenfenster.setTitle("Kunden der Firma Rollertel");
    kundenfenster.setSize(430, 270);
    kundenfenster.setLocation(30, 150);
    kundenfenster.setLayout(null);
    kundenfenster.setBackground(Color.pink);
    kundenfenster.setVisible(true);

    textbereich1 = new TextArea("", 0, 0,
                       TextArea.SCROLLBARS_VERTICAL_ONLY);
    textbereich1.setBounds(20, 40, 380, 180);
    textbereich1.setBackground(Color.lightGray);
    textbereich1.setForeground(Color.blue);
    textbereich1.setFont(new Font("Arial", Font.BOLD, 14));
    kundenfenster.add(textbereich1);
    kundenfenster.addWindowListener(new FensterZu());

    warenfenster = new Frame();
    warenfenster.setTitle("Lieferbare Waren der Firma Rollertel");
    warenfenster.setSize(430, 270);
    warenfenster.setLocation(530, 150);
    warenfenster.setLayout(null);
    warenfenster.setBackground(Color.pink);
    warenfenster.setVisible(true);

    textbereich2 = new TextArea("", 0, 0,
                       TextArea.SCROLLBARS_VERTICAL_ONLY);
    textbereich2.setBounds(20, 40, 380, 180);
    textbereich2.setBackground(Color.lightGray);
    textbereich2.setForeground(new Color(0, 128, 0));
    textbereich2.setFont(new Font("Arial", Font.BOLD, 14));
    warenfenster.add(textbereich2);
    warenfenster.addWindowListener(new FensterZu());
    } // Ende Konstruktor RollertelGO

  class FensterZu extends WindowAdapter {
    public void windowClosing(WindowEvent e)
      {System.exit(0);}
    } // Ende FensterZu

  void anzeige() {
    textbereich1.append(Kundendarstellung());
    textbereich2.append(Warendarstellung());
    } // Ende anzeige

  static void main (String[] xy) {
    RollertelGO firma = new RollertelGO();
    firma.anzeige();
    } // Ende main 

  } // Ende RollertelGO

class Kunde {
  // Kunden der Firma "Rollertel"
 
  static int anzahl = 0; 

  String name, anschrift;
  double rabattsatz;

  Kunde (String n, String a, double r) {
    name = n; anschrift = a;
    rabattsatz = r;
    anzahl = anzahl + 1;
    } // Ende Konstruktor

  double Rabattsatz()
    {return rabattsatz;}

  static int Anzahl()
    // Anzahl aller Kunden
    {return anzahl;}

  String Beschreibung()
    {return name + " (" + anschrift + ")\n";}

  } // Ende Kunde

class Ware {
  // Warenangebot der Firma "Rollertel"

  static int gesamtwert = 0; 

  String art, hersteller;
  int    preis, anzahl;

  Ware (String a, String h, int p, int n) {
    art = a; hersteller = h;
    preis = p; anzahl = n;
    gesamtwert = gesamtwert + preis * anzahl;
    } // Ende Konstruktor Ware

  int Preis()
    {return preis;}

  static int Gesamtwert()
    // Gesamtwert des Warenlagers
    {return gesamtwert;}

  String Beschreibung1()
    {return art + " (" + preis + " EUR) ";}

  String Beschreibung2()
    {return art + ", " + preis + " EUR, "
                + anzahl + " Stück auf Lager\n";}

  } // Ende Ware

class Bestellung {
  // Kunde tätigt Bestellung

  Kunde   kunde;
  Ware[]  warenliste;
  String  datum;
  boolean geliefert;

  Bestellung (Kunde k, Ware[] w, String d, boolean g) {
    kunde = k; warenliste = w;
    datum = d; geliefert = g;
    } // Ende Konstruktor Bestellung

  int Wert() {
    // Wert der Bestellung
    int summe = 0;
    for (int i = 0; i < warenliste.length; i = i + 1)
      summe = summe + warenliste[i].Preis();
    return summe;
    } // Ende Wert

  String Beschreibung() {
    String text = "";
    for (int i = 0; i < warenliste.length; i = i + 1)
      text = text + warenliste[i].Beschreibung1();
    return "Bestellung von " + kunde.Beschreibung()
                             + text + "\n";
    } // Ende Beschreibung

  } // Ende Bestellung

class Rechnung {
  // Rollertel erstellt Rechnung für Kunden

  static double außenstände = 0;

  Kunde        kunde;
  Bestellung[] bestellungen;
  String       datum;
  boolean      bezahlt;

  Rechnung (Kunde k, Bestellung[] b, String d, boolean bez) {
    kunde = k; bestellungen = b;
    datum = d; bezahlt = bez;
    if (! bezahlt)
      außenstände = außenstände + Betrag();
    } // Ende Konstruktor Rechnung

  boolean Bezahlt()
    {return bezahlt;}

  static double Außenstände()
    // Wert aller nicht bezahlten Rechnungen
    {return außenstände;}

  double Betrag() {
    // Rechnungsbetrag (inklusive Rabatt)
    int summe = 0;
    for (int i = 0; i < bestellungen.length; i = i + 1)
      summe = summe + bestellungen[i].Wert();
    return summe * (1 - kunde.Rabattsatz());
    } // Ende Betrag

  String Beschreibung() {
    return "Rechnung vom " + datum + " für " + kunde.Beschreibung()
                           + "über " + Betrag() + " EUR";
    } // Ende Beschreibung

  } // Ende Rechnung

