
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 SitzeZusammenfasser sitzeZusammenfasser;

  public SitzeZusammengefasst(Sitze sitze, CustomData customData) {
    super(customData);
    setGruppe(sitze.getGruppe());
    setGebiet(sitze.getGebiet());
    setAnzahl(sitze.getAnzahl());
    setAnzahlAnspruch(sitze.getAnzahlAnspruch());
    this.id = sitze.getId();
  }

  public SitzeZusammengefasst(Gruppe gruppe, Gebiet gebiet, Long anzahl, Long anzahlAnspruch, Long id) {
    setGruppe(gruppe);
    setGebiet(gebiet);
    setAnzahl(anzahl);
    setAnzahlAnspruch(anzahlAnspruch);
    this.id = id;
  }

  @Override
  public Sitze getSitzeVorperiode(Wahl wahl, AbstractSitzeDAO abstractSitzeDAO) {
    if (sitzeZusammenfasser == null) {
      sitzeZusammenfasser = new SitzeZusammenfasser();
    }

    return sitzeZusammenfasser.fasseSitzeZusammen(getGruppe(), getGebiet(), getZusammenzufassendeVorperiodeSitze(wahl, abstractSitzeDAO), getId());
  }

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

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

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

    return result;
  }

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

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