
package de.ivu.elect.core.exchange.stimmen.csv.dynamic;

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

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformationResolverContext;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
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.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public interface DynamicStimmenExchangeErgebnisDaten {

  List<Gruppe> getGruppenZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  List<Gruppe> getGruppenMitDirektkandidatZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wurzelgebiet);

  List<Gruppe> getGruppenMitListeZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wurzelgebiet) ;

  List<Liste> getZugelasseneListenZuGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  List<Liste> getZugelasseneListen();

  List<Direktkandidat> getZugelasseneDirektkandidaten();

  List<Direktkandidat> getZugelasseneDirektkandidatenZuGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWahlberechtigteNichtImWaehlerverzeichnis(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWahlberechtigteMitWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWahlberechtigteOhneWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWahlberechtigteGesamt(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWaehlerMitWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getUrnenwaehlerMitWahlscheinInUrnenwahllokal(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getBriefwaehlerMitWahlscheinInUrnenwahllokal(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWaehlerOhneWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getWaehlerGesamt(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getGueltigeZweitstimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getUngueltigeZweitstimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getGueltigeErststimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getUngueltigeErststimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getErststimmen(PolitischeGruppe gruppe, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getZweitstimmen(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Date getLetztenGueltigenEingangFuerGebiet(Wahldurchfuehrungsgebiet gebiet);

  Wahldurchfuehrung getWahl();

  Ergebnisart getErgebnisart();

  List<Direktkandidat> getDirektkandidaten();

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

  default ZulassungPruefer getZulassungPruefer() {
    return getEntityAufStimmzettelDaten().getZulassungPruefer();
  }

  default StimmzettelFormatter getStimmzettelFormatter() {
    return getEntityAufStimmzettelDaten().getStimmzettelFormatter();
  }

  EntityAufStimmzettelDaten getEntityAufStimmzettelDaten();

  WahlverwaltungGebietInformationResolverContext getWahlverwaltungGebietInformationResolverContext();

  Long getStimmenFuerListenkandidatur(Listenkandidatur listenkandidatur, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  @Nullable
  Long getStimmenNurListenkandidaturen(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  @Nullable
  Long getStimmenNurListe(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  @Nullable
  Long getStimmzettelNurEinzelnerWahlvorschlagVeraendert(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  @Nullable
  Long getStimmzettelNurEinzelnerWahlvorschlagUnveraendert(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Map<Wahlvorschlag, Long> getStimmzettelPositionenZugelasseneWahlvorschlaegeAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Map<Gruppe, List<ReferendumOption>> getReferendumOptionenNachReferendumVorlage();

  List<ReferendumOption> getReferendumOptionenEinerVorlageSortiertNachPosition(Gruppe referendumVorlage);

  Long getStimmenFuerReferendumOption(ReferendumOption referendumOption, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getGueltigeFuerReferendumVorlage(Gruppe vorlage, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);

  Long getUngueltigeFuerReferendumVorlage(Gruppe vorlage, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet);
}
