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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;

import de.ivu.elect.business.ergebnis.boundary.AbstractSitzeDAO;
import de.ivu.elect.business.ergebnis.boundary.SitzeZusammenfasser;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.customdata.CustomData;

public class SitzeZusammengefasst extends Sitze {

  private static final long serialVersionUID = 1L;

  private final SitzeZusammenfasser sitzeZusammenfasser;

  public SitzeZusammengefasst(SitzeZusammenfasser sitzeZusammenfasser, Sitze sitze, CustomData customData) {
    this(sitzeZusammenfasser, sitze.getId(), sitze.getGruppe(), sitze.getGebiet(), sitze.getAnzahl(), sitze.getAnzahlAnspruch(), customData);
  }

  public SitzeZusammengefasst(SitzeZusammenfasser sitzeZusammenfasser, Long id, Gruppe gruppe, Gebiet gebiet, Long anzahl, Long anzahlAnspruch, CustomData customData) {
    super(customData);

    this.sitzeZusammenfasser = sitzeZusammenfasser;

    setId(id);

    setGruppe(gruppe);
    setGebiet(gebiet);

    setAnzahl(anzahl);
    setAnzahlAnspruch(anzahlAnspruch);
  }

  @Override
  public Sitze getSitzeVorperiode(Wahl wahl, AbstractSitzeDAO sitzeDAO) {
    return sitzeZusammenfasser.fasseSitzeZusammen(getId(), getGruppe(), getGebiet(), getZusammenzufassendeSitzeVorperiode(wahl, sitzeDAO));
  }

  private Collection<Sitze> getZusammenzufassendeSitzeVorperiode(Wahl wahl, AbstractSitzeDAO sitzeDAO) {
    Collection<Sitze> result = new ArrayList<>();

    // WASDE-1177 komischen Destatis-Bund-Hack wieder raus
    // if (!getGebiet().isWurzelgebiet()) {
    Optional.ofNullable(super.getSitzeVorperiode(wahl, sitzeDAO)).ifPresent(result::add);
    // }

    getGebiet().getUntergeordneteGebiete().forEach(gebiet -> Optional.ofNullable(super.getSitzeVorperiode(wahl, gebiet, sitzeDAO)).ifPresent(result::add));

    return result;
  }

  @Override
  public boolean equals(Object obj) {
    return this == obj;
  }

  @Override
  public int hashCode() {
    return id.hashCode();
  }
}
