import java.util.LinkedList;
import java.util.List;

/* Dieser Aufzaehlungstyp modelliert die deutsche
   Mehrwertsteuer mit ihren unterschiedlichen Satezen. */
enum Mehrwertsteuersatz {
   NORMAL(0.19, "Normale Mwst."),
   REDUZIERT(0.07, "Reduzierte Mwst.");

   final double satz;
   final String name;

   Mehrwertsteuersatz(double satz, String name) {
      this.satz = satz;
      this.name = name;
   }
}

/* Oberklasse fuer alle Produkte */
class Produkt {

   double preis;
   Mehrwertsteuersatz satz;

   public Produkt(double preis, Mehrwertsteuersatz satz) {
      this.preis = preis;
      this.satz = satz;
   }

   double berechneBetrag() {
      return preis * (1.0f + satz.satz);
   }
}

class Segelboot extends Produkt {

   public int anzahlKabinen;

   public void segelSetzen() {
   }

   public void steuern() {
   }

   public Segelboot(int anzahlKabinen, double betrag) {
      super(betrag, Mehrwertsteuersatz.NORMAL);
      this.anzahlKabinen = anzahlKabinen;
   }
}

class Sonnenschirm extends Produkt {

   enum Muster {
      GruenWeissGestreift, OrangeGelbGepunktet, Rot
   }

   Muster muster;

   void aufspannen() {
   }

   public Sonnenschirm(Muster muster, double preis) {
      super(preis, Mehrwertsteuersatz.NORMAL);
      this.muster = muster;
   }
}

class Eis extends Produkt {

   enum Geschmacksrichtung {
      Zitrone, Erdbeer, Vanille, Schokolade
   }

   Geschmacksrichtung geschmack;

   void essen() {
   }

   public Eis(Geschmacksrichtung geschmack, double nettoPreis) {
      super(nettoPreis, Mehrwertsteuersatz.REDUZIERT);
      this.geschmack = geschmack;
   }
}

class Haengematte extends Produkt {

   double spannweite;

   void aufhaengen() {
   }

   public Haengematte(double spannweite, double kosten) {
      super(kosten, Mehrwertsteuersatz.NORMAL);
      this.spannweite = spannweite;
   }
}

class Buch extends Produkt {

   String titel;

   void lesen() {
   }

   public Buch(String titel, double unkosten) {
      super(unkosten, Mehrwertsteuersatz.NORMAL);
      this.titel = titel;
   }
}

/* Ein Einkaufskorb sammelt mehrere Produkte und kann
   den Gesamtpreis bestimmen. */
class EinkaufsKorb {

   List<Produkt> produkte;

   public EinkaufsKorb() {
      this.produkte = new LinkedList<Produkt>();
   }

   void hinzufuegen(Produkt p) {
      produkte.add(p);
   }

   double gesamtpreis() {
      double ergebnis = 0.0;
      for (Produkt produkt : produkte) {
         ergebnis += produkt.berechneBetrag();
      }
      return ergebnis;
   }
}

public class Warenhaus {

   public static void main(String[] args) {
      // Produkte definieren
      Segelboot boot = new Segelboot(2, 39999.99);
      Eis eis = new Eis(Eis.Geschmacksrichtung.Erdbeer, 2.0);
      Sonnenschirm schirm = new Sonnenschirm(Sonnenschirm.Muster.Rot, 99.99);
      Buch buch = new Buch("Last Act in Palmyra", 8.99);
      Haengematte haengematte = new Haengematte(2.5, 39.95);

      // Gesamtpreis berechnen
      EinkaufsKorb einkaufsKorb = new EinkaufsKorb();
      einkaufsKorb.hinzufuegen(boot);
      einkaufsKorb.hinzufuegen(eis);
      einkaufsKorb.hinzufuegen(schirm);
      einkaufsKorb.hinzufuegen(buch);
      einkaufsKorb.hinzufuegen(haengematte);

      System.out.println("Der Gesamtpreis beträgt " + Math.round(einkaufsKorb.gesamtpreis() * 100.0) / 100.0 + " EUR (inkl. Steuern).");
   }
}