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

import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeGruppeStimmenErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeKopfzahlErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeListenkandidaturStimmenErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabePlausiBuilder;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeReferendumOptionStimmenErfassenLabelGenerator;
import de.ivu.elect.business.wahl.entity.Wahl;

/**
 * Konfiguration der Stimmenerfassung. Diese umfasst
 * <ul>
 * <li>die vier Stimmeingabe*ErfassenModelBuilder,</li>
 * <li>die vier Stimmeingabe*ErfassenLabelGenerator</li>
 * <li>der StimmeingabePlausiBuilder</li>
 * </ul>
 *
 */
public interface StimmeingabeErfassenDescription {

  boolean isApplicable(Wahl wahl);

  StimmeingabeKopfzahlErfassenModelBuilder getStimmeingabeKopfzahlErfassenModelBuilder();

  StimmeingabeGruppeStimmenErfassenModelBuilder getStimmeingabeGruppeStimmenErfassenModelBuilder();

  StimmeingabeListenkandidaturStimmenErfassenModelBuilder getStimmeingabeListenkandidaturStimmenErfassenModelBuilder();

  StimmeingabeReferendumOptionStimmenErfassenModelBuilder getStimmeingabeReferendumOptionStimmenErfassenModelBuilder();

  StimmeingabeKopfzahlErfassenLabelGenerator getStimmeingabeKopfzahlErfassenLabelGenerator();

  StimmeingabeGruppeStimmenErfassenLabelGenerator getStimmeingabeGruppeStimmenErfassenLabelGenerator();

  StimmeingabeListenkandidaturStimmenErfassenLabelGenerator getStimmeingabeListenkandidaturStimmenErfassenLabelGenerator();

  StimmeingabeReferendumOptionStimmenErfassenLabelGenerator getStimmeingabeReferendumOptionStimmenErfassenLabelGenerator();

  StimmeingabePlausiBuilder getStimmeingabePlausiBuilder();

  /**
   * In dieser Methode wird an den Ergebniseingang die benötigten StimmeingabeL*ErfassenModels angehängt (transiente Attribute der Entity). Dafür werden je nach Wahl einige der
   * Stimmeingabe*ErfassenModelBuilder benötigt.
   *
   * @param context
   *          enthält u.a. den Ergebniseingang
   */
  void buildStimmeingabeErfassenModels(StimmeingabeErfassenContext context);
}
