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

import java.util.List;
import java.util.Map;

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;

public interface BestimmeStimmen<Target, G extends GebietUndStimmabgabeart> {

  /**
   * Ermittelt die Stimmen für ein Erfassungsgebiet für ein Target-Element
   */
  @Nullable
  Long ermittleStimmen(Target target, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  /**
   * Ermittelt die Stimmen für ein relevantes Untergebiet für alle Target-Elemente. Dies erfolgt in der Regel rekursiv.
   */
  Map<Target, Long> getErgebnisUntergebiet(G gebietUndStimmabgabeart);

  /**
   * @param gebietUndStimmabgabeart
   *          ein Erfassungsgebiet + Filter auf Untergebieten
   * @return die Liste der Targets, für die {@link #ermittleStimmen(Object, Wahldurchfuehrungsgebiet)} aufgerufen wird,
   */
  List<Target> getTargetAufGebiet(G gebietUndStimmabgabeart);

}