package de.ivu.elect.business.gebietsbaum.boundary;

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

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.control.AWerteAktualisierer;
import de.ivu.elect.business.gebietsbaum.control.AWerteAktualisiererFactory;
import de.ivu.elect.business.gebietsbaum.control.WasGebietCreate;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.Wahl;

@Stateless
@Specializes
public class WasGebietsbaumStimmbezirkImporter extends GebietsbaumStimmbezirkImporter {

  @Inject
  private transient WasGebietCreate wasGebietCreate;

  @Inject
  private transient WahldurchfuehrungsgebietDAO wahldurchfuehrungsgebietDAO;

  @Inject
  private transient AWerteAktualisiererFactory aWerteAktualisiererFactory;

  @Override
  protected void postCreateGebiet(Gebiet gebiet) {
    super.postCreateGebiet(gebiet);
    wasGebietCreate.createVerantwortlichBerichtetAn(gebiet); // Gebiete in Übergeornetem Mandanten anlegen
  }

  @Override
  protected void postCreateGebiete(List<Gebiet> persistierteGebiete, Wahl wahl) {
    super.postCreateGebiete(persistierteGebiete, wahl);
    AWerteAktualisierer aWerteAktualisierer = aWerteAktualisiererFactory.createAWerteAktualisierer(wahl);
    if (persistierteGebiete.stream().map(g -> g.castTo(Wahldurchfuehrungsgebiet.class).getEntity())
        .anyMatch(g -> g.getAnzahlWahlberechtigterGesamtA1A2A3() != null && g.getAnzahlWahlberechtigterGesamtA1A2A3() > 0)) {
      wahldurchfuehrungsgebietDAO.flush();
      Set<Gebiet> uebergeordnetBerechnet = new HashSet<>();
      for (Gebiet gebiet : persistierteGebiete) {
        Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = gebiet.castTo(Wahldurchfuehrungsgebiet.class).getEntity();

        if (wahldurchfuehrungsgebiet.getUebergeordnetesGebiet() != null && !uebergeordnetBerechnet.contains(
            wahldurchfuehrungsgebiet.getUebergeordnetesGebiet())) {
          if (wahldurchfuehrungsgebiet.getAnzahlWahlberechtigterGesamtA1A2A3() != null && wahldurchfuehrungsgebiet
              .getAnzahlWahlberechtigterGesamtA1A2A3() > 0) {
            aWerteAktualisierer.aktualisiereAWerteFuerUebergeordneteGebieteVon(wahldurchfuehrungsgebiet);
            uebergeordnetBerechnet.add(wahldurchfuehrungsgebiet.getUebergeordnetesGebiet()); // Berechnung nur einmal pro übergeordnetem Gebiet notwendig
          }
        }
      }
    }
  }
}
