
package de.ivu.elect.business.veranstaltung.entity;

import java.util.HashSet;
import java.util.Set;

import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.wahl.entity.Wahl;

public abstract class AbstractVeranstaltung implements VeranstaltungBase, EntityMitGebiet, EntityMitSchulungArt {

  private static final long serialVersionUID = 1L;

  public AbstractVeranstaltung() {
    super();
  }

  protected void preSetWahl(Wahl alterWert, Wahl wahl) {
    // nichts zu tun
  }

  protected void postSetWahl(Wahl alterWert, Wahl wahl) {
    if (wahl != null) {
      setWahltermin(wahl.getWahltermin());
    }
  }

  public Set<Veranstaltung> bestimmeAlleVerknuepfteVeranstaltungen() {
    return bestimmeAlleVerknuepfteVeranstaltungen(new HashSet<Veranstaltung>());

  }

  protected Set<Veranstaltung> bestimmeAlleVerknuepfteVeranstaltungen(Set<Veranstaltung> veranstaltungen) {

    veranstaltungen.add((Veranstaltung) this);

    if (getVerknuepfteVeranstaltung() != null && !veranstaltungen.contains(getVerknuepfteVeranstaltung())) {
      getVerknuepfteVeranstaltung().bestimmeAlleVerknuepfteVeranstaltungen(veranstaltungen);
    }

    for (Veranstaltung veranstaltung : getVeranstaltungsByVerknuepfteVeranstaltung()) {
      if (!veranstaltungen.contains(veranstaltung)) {
        veranstaltung.bestimmeAlleVerknuepfteVeranstaltungen(veranstaltungen);
      }
    }

    return veranstaltungen;
  }

  public long getTeilnehmerAnzahl() {
    return getTeilnahmesByVeranstaltung().stream() //
        .filter(Teilnahme::isVorgesehenOderTeilgenommen) //
        .count();
  }

  public boolean isUeberbelegt() {
    return getTeilnehmerAnzahlMax() != null && getTeilnehmerAnzahl() > getTeilnehmerAnzahlMax();
  }

  /**
   * ELECT-8703 TODO ELECT-8705
   */
  public SchulungArt getSchulungArtNotNull() {
    if (getSchulungArt() == null) {
      return SchulungArt.SONSTIGE;
    }

    return getSchulungArt();
  }
}
