package aufgabe09.entitaeten;

import aufgabe09.validatoren.Preiskontrolle;
import aufgabe09.validatoren.Produkteinschraenkung;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Version;
import javax.validation.constraints.Pattern;

@Entity
// folgende Annotationen gehören eigentlich an posten, geht aber nicht
@Produkteinschraenkung(max = 4, message = "maximal 4 unterschiedliche Produkte")
@Preiskontrolle(grenze = 10000, message = "Preisobergrenze beachten")
public class Bestellung implements Serializable {

  @Id
  @GeneratedValue
  private int bestnr;
  @Pattern(regexp = "[a-zA-Z]+\\s[a-zA-Z]+", message = "Vor- und Nachname angeben")
  private String kunde;

  /* geht nicht,zweiter Parameter bei HashMap muss Produkt sein
  @ManyToMany(mappedBy="bestellungen",
  cascade = {CascadeType.PERSIST,CascadeType.MERGE})
  @MapKey(name="produktnr")
  private Map<Integer,Integer> produkte= new HashMap<Integer,Integer>();
   */
  @OneToMany(mappedBy = "bestellung", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  private Set<Bestellposten> posten = new HashSet<Bestellposten>();
  @Version
  private int version;

  public Bestellung() {
  }

  public Bestellung(String kunde) {
    this.kunde = kunde;
  }

  public void addPosten(Bestellposten p) {
    getPosten().add(p);
    p.getProdukt().addPosten(p);
  }

  public void deletePosten(Bestellposten p) {
    p.getProdukt().deletePosten(p);
    getPosten().remove(p);
  }

  public int getBestnr() {
    return bestnr;
  }

  public void setBestnr(int bestnr) {
    this.bestnr = bestnr;
  }

  public String getKunde() {
    return kunde;
  }

  public void setKunde(String kunde) {
    this.kunde = kunde;
  }

  public Set<Bestellposten> getPosten() {
    return posten;
  }

  public void setProdukte(Set<Bestellposten> posten) {
    this.posten = posten;
  }

  public int getVersion() {
    return version;
  }

  public void setVersion(int version) {
    this.version = version;
  }

  @Override
  public String toString() {
    StringBuffer ergebnis = new StringBuffer(bestnr + ":" + kunde + "\n");
    for (Bestellposten p : posten) {
      ergebnis.append(" " + p + "\n");
    }
    return ergebnis.toString();
  }
}
