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

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import de.ivu.elect.business.ergebnis.boundary.AbstractErgebnisDAO;
import de.ivu.elect.business.ergebnis.boundary.AbstractStimmenDAO;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.wahl.entity.Wahl;

public abstract class AbstractStimmenPoolFactory implements Serializable, StimmenPoolFactory {

  private static final long serialVersionUID = 1L;

  private final Map<Wahl, StimmenPool> cache = new HashMap<>();

  public AbstractStimmenPoolFactory() {
    super();
  }

  @Override
  public StimmenPool createStimmenPoolVorperiode(Wahl wahl) {
    if (wahl == null) {
      return StimmenPool.createStimmenPoolLeer();
    }

    return cache.computeIfAbsent(wahl, ignore -> StimmenPool.createStimmenPool(getStimmenDAO(), getErgebnisDAO().findByWahlAndErgebnisart(wahl, Ergebnisart.VORPERIODE).get(0)));
  }

  protected abstract AbstractErgebnisDAO getErgebnisDAO();

  protected abstract AbstractStimmenDAO getStimmenDAO();
}
