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

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppeEigenschaften;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsherkunft;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehler;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.entity.AbstractWahlParameterLoader;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.tk.EntityTK;

public interface StimmeingabeErfassenContext extends StimmeingabeKopfzahlKonfigurationContext{

  Wahldurchfuehrung getWahldurchfuehrung();

  Wahldurchfuehrungsgebiet getWahldurchfuehrungsgebiet();

  String getGebietName();

  boolean isBriefwahlgebiet();

  Ergebniseingang getErgebniseingang();

  Ergebniseingangsart getErgebniseingangsart();

  Ergebniseingangsherkunft getErgebniseingangsherkunft();

  boolean isErgebniseingangsart(Ergebniseingangsart ergebniseingangsart);

  boolean isErgebniseingangsartEndgueltig();

  boolean isErgebniseingangsartVorlaeufig();

  Collection<GruppeImGebiet> getGruppenImGebiet();

  boolean hasLetzterErgebniseingangAktuell();

  boolean isLetzterErgebniseingangAktuellGueltig();

  /**
   * HINT: Der letzte Ergebniseingang wird insbesondere genutzt, wenn die Modelbuilder die Stimmeingaben des neuen Ergebniseingangs bauen. Dort dienen die Eingaben des letzten Ergebniseingangs als
   * Vorbelegungen.
   */
  Ergebniseingang getLetzterErgebniseingangAktuell();

  Collection<Stimmeingabe> getLetzterErgebniseingangAktuellStimmeingaben();

  Map<EntityTK, Stimmeingabe> getLetzterErgebniseingangAktuellStimmeingabenPerTk();

  List<Stimmeingabefehler> getLetzterErgebniseingangAktuellStimmeingabefehler();

  Map<EntityTK, List<Stimmeingabefehler>> getLetzterErgebniseingangAktuellStimmeingabefehlerPerTk();

  Collection<Stimmeingabe> getLetzterErgebniseingangAktuellVorlaeufigStimmeingaben(); // ELECT-8352

  Collection<Stimmeingabe> getVergleichErgebniseingangStimmeingaben();

  Map<EntityTK, Stimmeingabe> getVergleichErgebniseingangStimmeingabenPerTk();

  EntityAufStimmzettelDaten getEntityAufStimmzettelDaten();

  StimmeingabeKopfzahlErfassenLabelGenerator getStimmeingabeKopfzahlErfassenLabelGenerator();

  StimmeingabeGruppeStimmenErfassenLabelGenerator getGruppeStimmenErfassenLabelGenerator();

  StimmeingabeListenkandidaturStimmenErfassenLabelGenerator getListenkandidaturStimmenErfassenLabelGenerator();

  StimmeingabeReferendumOptionStimmenErfassenLabelGenerator getReferendumOptionStimmenErfassenLabelGenerator();

  Map<SystemGruppe, GruppeImGebiet> getGruppenImGebietPerSystemGruppe(SystemGruppeEigenschaften systemGruppeEigenschaften);

  Supplier<Map<Gruppe, Collection<Wahlvorschlag>>> getWahlvorschlaege();

  default AbstractWahlParameterLoader getWahlParameterLoader() {
    return getEntityAufStimmzettelDaten().getWahlParameterLoader();
  }
}
