import java.util.*;
import java.lang.Math;

/* Dieser Aufzaehlungstyp modelliert die deutsche 
   Mehrwertsteuer mit ihren unterschiedlichen Satezen. */
enum Mehrwertsteuer {
  NORMAL(0.19, "Normale Mwst"), REDUZIERT(0.07, "Reduzierte Mwst");
  
  double satz;
  String name;
  
  Mehrwertsteuer(double satz, String name) {
    this.satz = satz;
    this.name = name;
  }
}

/* Ein Einkaufskorb sammelt mehrere Produkte und kann 
   den Gesamtpreis bestimmen. */
class Warenkorb {
  HashSet<Produkt> produkte = new HashSet<Produkt>();
  
  public void hinzufuegen(Produkt produkt) {
    produkte.add(produkt);
  }
  
  public double gesamtpreis() {
    double gesamt = 0;
    for (Produkt p : produkte) {
      gesamt += p.preis();
    }
    return gesamt;
  }
}

/* Oberklasse fuer alle Produkte */
class Produkt {
  double preis;
  Mehrwertsteuer mwst;
  
  public Produkt(double preis) {
    this.preis = preis;
  }
  
  double preis() {
    return preis * (1 + mwst.satz);
  }
}

/* Ein Segelboot ist ein Produkt mit dem normalen
   Mehrwertsteuersatz */
class Segelboot extends Produkt {
  public int anzahlKabinen;
  public void segelSetzen() {}
  public void steuern() {}
  
  public Segelboot(int anzahlKabinen, double betrag) {
    super(betrag);
    this.anzahlKabinen = anzahlKabinen;
    mwst = Mehrwertsteuer.NORMAL;
  }
}

/* Ein Sonnenschirm ist ein Produkt mit dem normalen
   Mehrwertsteuersatz */
class Sonnenschirm extends Produkt {
  enum Muster {
    GruenWeissGestreift, OrangeGelbGepunktet, Rot
  }
  
  Muster muster;
  void aufspannen() {}

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

/* Ein Eis ist ein Produkt mit dem reduzierten
   Mehrwertsteuersatz */
class Eis extends Produkt {
  enum Geschmacksrichtung {
    Zitrone, Erdbeer, Vanille, Schokolade
  }

  Geschmacksrichtung geschmack;
  void essen() {}

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

/* Eine Haengematte ist ein Produkt mit dem normalen
   Mehrwertsteuersatz */
class Haengematte extends Produkt {
  double spannweite;
  void aufhaengen() {}

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

/* Ein Buch ist ein Produkt mit dem reduzierten
   Mehrwertsteuersatz */
class Buch extends Produkt {
  String titel;
  void lesen() {}

  public Buch(String titel, double unkosten) {
    super(unkosten);
    this.titel = titel;
    mwst = Mehrwertsteuer.REDUZIERT;
  }
}

public class WarenhausLoesung {
  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);
    
    // Im Einkaufskorb sammeln
    Warenkorb warenkorb = new Warenkorb();
    warenkorb.hinzufuegen(boot);
    warenkorb.hinzufuegen(eis);
    warenkorb.hinzufuegen(schirm);
    warenkorb.hinzufuegen(buch);
    warenkorb.hinzufuegen(haengematte);
    
    // Gesamtpreis berechnen
    System.out.println("Der Gesamtpreis beträgt " + Math.round(warenkorb.gesamtpreis()*100.0)/100.0 + " EUR (inkl. Steuern).");
  }
}