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

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

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.business.wahl.control.Wahldaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public interface StimmeingabeDocumentErgebnisDaten<G extends Gebiet> {

  GruppeImGebiet getGruppeImGebiet(Gruppe gruppe, G gebiet);

  Wahldaten< ? extends Wahl, G> getWahldaten();

  StimmeingabeDocumentReferendumErgebnisDaten<G> getErgebnisDatenReferendumOptionen();

  Wahl getWahl();

  List<Wahlvorschlag> getWahlvorschlaege();

  @Nullable
  Long getWahlberechtigteGesamtFuerErfassungsgebietUnterhalbVonAnzahlGesamt(G gebiet); // A

  @Nullable
  Long getWahlberechtigteOhneWahlscheinFuerErfassungsgebietUnterhalbVonAnzahl(G gebiet); // A1

  @Nullable
  Long getWahlberechtigteMitWahlscheinFuerErfassungsgebietUnterhalbVonAnzahl(G gebiet); // A2

  @Nullable
  Long getWahlberechtigteNichtImWaehlerverzeichnisFuerErfassungsgebietUnterhalbVonAnzahl(G gebiet); // A3

  default EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    return getWahldaten().getEntityAufStimmzettelDaten();
  }

  @Nullable
  Long getWaehlerOhneWahlschein(G gebiet);

  @Nullable
  Long getWaehlerMitWahlschein(G gebiet);

  @Nullable
  Long getWaehlerMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl(G gebiet);

  @Nullable
  Long getWaehlerMitWahlscheinInUrnenwahlAnzahlAusBriefwahl(G gebiet);

  @Nullable
  Long getWaehlerMitVollmacht(G gebiet);

  @Nullable
  Long getWaehlerGesamt(G gebiet);

  @Nullable
  Long getWahlbriefeZurueckgewiesenGesamt(G gebiet);

  Map<PolitischeGruppe, Long> getErststimmenAktuellGesamt(G gebiet);

  Map<PolitischeGruppe, Long> getZweitstimmenAktuellGesamt(G gebiet);

  @Nullable
  Long getStimmenFuerListenkandidatur(Listenkandidatur listenkandidatur, G gebiet);

  @Nullable
  Long getStimmenNurListenkandidaturen(G gebiet);

  @Nullable
  Long getStimmenNurListenkandidaturen(Liste liste, G gebiet);

  @Nullable
  Long getStimmenNurListe(G gebiet);

  @Nullable
  Long getStimmenNurListe(Liste liste, G gebiet);

  @Nullable // A.k.a. "Stimmzettel für genau einen Wahlvorschlag unverändert"
  Long getStimmzettelNurEinzelnerWahlvorschlagUnveraendert(G gebiet);

  @Nullable
  Long getStimmzettelNurEinzelnerWahlvorschlagUnveraendert(Liste liste, G gebiet);

  @Nullable // A.k.a. "Stimmzettel für genau einen Wahlvorschlag mit Änderungen nur in diesem"
  Long getStimmzettelNurEinzelnerWahlvorschlagVeraendert(G gebiet);

  @Nullable
  Long getStimmzettelNurEinzelnerWahlvorschlagVeraendert(Liste liste, G gebiet);

  @Nullable // A.k.a. "Stimmzettel für genau einen Wahlvorschlag mit panaschierten Stimmen"
  Long getStimmzettelNurEinzelnerWahlvorschlagPanaschiert(G gebiet);

  @Nullable
  Long getStimmzettelNurEinzelnerWahlvorschlagPanaschiert(Liste liste, G gebiet);

  @Nullable // A.k.a. "Stimmzettel für keinen einzelnen Wahlvorschlag aber mit Änderungen nur in genau einem Wahlvorschlag"
  Long getStimmzettelKeinEinzelnerWahlvorschlagVeraendert(G gebiet);

  @Nullable // A.k.a. "Stimmzettel für keinen einzelnen Wahlvorschlag mit panaschierten Stimmen"
  Long getStimmzettelKeinEinzelnerWahlvorschlagPanaschiert(G gebiet);

  @Nullable
  Long getStimmzettelUngueltig(G gebiet);

  @Nullable
  Long getStimmzettelUnbestimmt(G gebiet);

  @Nullable
  Long getStimmzettelGesamt(G gebiet);

  @Nullable
  Long getVersionsnummerStimmzettelerfassung(G gebiet);

  List<Stimmzettel> getStimmzettel(G gebiet);
}
