
package de.ivu.elect.business.sitzberechnung.control;

import java.util.Collection;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungsergebnis;

/**
 * Dient dem Zusammenfassen von Sitzberechnungsergebnissen auf Teilgebieten, die voneinander unabhängig durchgeführt
 * werden können
 * 
 *  on 07.04.2016.
 */
public abstract class SitzberechnungAkkumulator<Konfiguration extends SitzberechnungsalgorithmusKonfiguration> {

  protected abstract Collection< ? extends Gebiet> getGebiete(
      Sitzberechnungseingabe<Konfiguration> sitzberechnungseingabe);

  protected abstract Sitzberechnungsergebnis berechneSitzverteilung(Wahldurchfuehrungsgebiet gebiet,
      Sitzberechnungseingabe<Konfiguration> sitzberechnungseingabe);

  public Sitzberechnungsergebnis berechneSitzverteilung(Sitzberechnungseingabe<Konfiguration> sitzberechnungseingabe) {
    Sitzberechnungsergebnis result = Sitzberechnungsergebnis.createLeeresErgebnis();
    for (Gebiet gebiet : getGebiete(sitzberechnungseingabe)) {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet;
      if (gebiet instanceof Wahldurchfuehrungsgebiet) {
        wahldurchfuehrungsgebiet = (Wahldurchfuehrungsgebiet) gebiet;
      } else {
        wahldurchfuehrungsgebiet = gebiet.castTo(Wahldurchfuehrungsgebiet.class).getEntity();
      }

      Sitzberechnungsergebnis sitzberechnungsergebnis = berechneSitzverteilung(wahldurchfuehrungsgebiet,
          sitzberechnungseingabe);
      result.addAll(sitzberechnungsergebnis);
    }

    return result;
  }
}
