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

import java.util.Collection;

import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungToCalculateParameters;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumEinsatzfunktion;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumEinsatzort;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumPersonendatenArt;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenArt;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

public interface PersonendatenEntschaedigungCalculator {

  Collection<Entschaedigungsart> getSupportedEntschaedigungsarten(Wahl wahl, Wahltermin wahltermin);

  <T extends PersonendatenArt & EntschaedigungsartKriteriumPersonendatenArt> T getSupportedPersonendatenArt();

  Collection<EntschaedigungsartKriteriumEinsatzort> getSupportedEinsatzorte();

  Collection<EntschaedigungsartKriteriumEinsatzfunktion> getSupportedEinsatzfunktionen();

  Collection<Entschaedigung> calculate(EntschaedigungAggregator entschaedigungenFuerPersonendatenAggregator, EntschaedigungToCalculateParameters entschaedigungToCalculateParameters);

  Collection<Entschaedigung> calculate(EntschaedigungAggregator entschaedigungenFuerPersonendatenAggregator, Personendaten personendaten,
      EntschaedigungToCalculateParameters entschaedigungToCalculateParameters);
}
