
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.control.AbstractErgebnisDatenWahlberechtigte;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenWaehler;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenWahlbriefe;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
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.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
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 class DynamicStimmenExchangeErgebnisDatenWrapper implements DynamicStimmenExchangeErgebnisDaten {

  private final ErgebnisDaten ergebnisDaten;

  private final AbstractErgebnisDatenWahlberechtigte ergebnisDatenWahlberechtigte;

  private final ErgebnisDatenWaehler ergebnisDatenWaehler;

  private final ErgebnisDatenWahlbriefe ergebnisDatenWahlbriefe;

  private final Stimmabgabeart stimmabgabeart;

  public DynamicStimmenExchangeErgebnisDatenWrapper(ErgebnisDaten ergebnisDaten) {
    super();

    this.ergebnisDaten = ergebnisDaten;
    this.ergebnisDatenWahlberechtigte = ergebnisDaten.getErgebnisDatenWahlberechtigte();
    this.ergebnisDatenWaehler = ergebnisDaten.getErgebnisDatenWaehler();
    this.ergebnisDatenWahlbriefe = ergebnisDaten.getErgebnisDatenWahlbriefe();

    this.stimmabgabeart = Stimmabgabeart.GESAMT;
  }

  @Override
  public Long getWahlberechtigteOhneWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWahlberechtigte.getSummeWahlberechtigteOhneWahlschein(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWahlberechtigteMitWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWahlberechtigte.getSummeWahlberechtigteMitWahlschein(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWahlberechtigteNichtImWaehlerverzeichnis(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWahlberechtigte.getSummeWahlberechtigteNichtImWaehlerverzeichnis(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWahlberechtigteGesamt(Wahldurchfuehrungsgebiet gebiet) {
    return ergebnisDatenWahlberechtigte.getSummeWahlberechtigteGesamt(gebiet, stimmabgabeart);
  }

  @Override
  public Long getWaehlerOhneWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWaehler.getSummeWaehlerOhneWahlschein(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWaehlerMitWahlschein(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWaehler.getSummeWaehlerMitWahlschein(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getUrnenwaehlerMitWahlscheinInUrnenwahllokal(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWaehler.getSummeWaehlerMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getBriefwaehlerMitWahlscheinInUrnenwahllokal(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWaehler.getSummeWaehlerMitWahlscheinInUrnenwahlAnzahlAusBriefwahl(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWaehlerGesamt(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWaehler.getSummeWaehlerGesamt(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getWahlbriefeZurueckgewiesen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDatenWahlbriefe.getSummeWahlbriefeZurueckgewiesenGesamt(new GebietUndStimmabgabeart(wahldurchfuehrungsgebiet, stimmabgabeart));
  }

  @Override
  public Long getGueltigeErststimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErststimmenAktuellGueltige(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getGueltigeZweitstimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getZweitstimmenAktuellGueltige(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getUngueltigeErststimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErststimmenAktuellUngueltige(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getUngueltigeZweitstimmen(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getZweitstimmenAktuellUngueltige(wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Long getZweitstimmen(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getZweitstimmenAktuell(liste, wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Nullable
  @Override
  public Date getLetztenGueltigenEingangFuerGebiet(Wahldurchfuehrungsgebiet gebiet) {
    Ergebniseingang letztenGueltigenEingangFuerGebiet = ergebnisDaten.getLetztenGueltigenEingangFuerGebiet(gebiet);
    if (letztenGueltigenEingangFuerGebiet == null) {
      return null;
    }
    return letztenGueltigenEingangFuerGebiet.getZeitstempel();
  }

  @Override
  public Long getErststimmen(PolitischeGruppe politischeGruppe, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErststimmenAktuell(politischeGruppe, wahldurchfuehrungsgebiet, stimmabgabeart);
  }

  @Override
  public Wahldurchfuehrung getWahl() {
    return ergebnisDaten.getWahl();
  }

  @Override
  public Ergebnisart getErgebnisart() {
    return ergebnisDaten.getErgebnis().getErgebnisart();
  }

  @Override
  public List<Direktkandidat> getDirektkandidaten() {
    return ergebnisDaten.getDirektkandidaten();
  }

  @Override
  public EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    return ergebnisDaten.getEntityAufStimmzettelDaten();
  }

  @Override
  public WahlverwaltungGebietInformationResolverContext getWahlverwaltungGebietInformationResolverContext() {
    return new WahlverwaltungGebietInformationResolverContext(ergebnisDaten);
  }

  @Override
  public Long getStimmenFuerListenkandidatur(Listenkandidatur listenkandidatur, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErgebnisDatenListenkandidaturen().getStimmenFuerListenkandidatur(listenkandidatur, wahldurchfuehrungsgebiet);
  }

  @Nullable
  @Override
  public Long getStimmenNurListenkandidaturen(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmenNurListenkandidaturen(liste, wahldurchfuehrungsgebiet);
  }

  @Nullable
  @Override
  public Long getStimmenNurListe(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmenNurListe(liste, wahldurchfuehrungsgebiet);
  }

  @Nullable
  @Override
  public Long getStimmzettelNurEinzelnerWahlvorschlagVeraendert(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmzettelNurEinzelnerWahlvorschlagVeraendert(liste, wahldurchfuehrungsgebiet);
  }

  @Nullable
  @Override
  public Long getStimmzettelNurEinzelnerWahlvorschlagPanaschiert(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmzettelNurEinzelnerWahlvorschlagPanaschiert(liste, wahldurchfuehrungsgebiet);
  }

  @Nullable
  @Override
  public Long getStimmzettelNurEinzelnerWahlvorschlagUnveraendert(Liste liste, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmzettelNurEinzelnerWahlvorschlagUnveraendert(liste, wahldurchfuehrungsgebiet);
  }

  @Override
  public Map<Wahlvorschlag, Long> getStimmzettelPositionenZugelasseneWahlvorschlaegeAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getStimmzettelPositionenZugelasseneWahlvorschlaegeAufGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public List<Liste> getZugelasseneListenZuGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getZugelasseneListenZuGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public List<Liste> getZugelasseneListen() {
    return ergebnisDaten.getZugelasseneListen();
  }

  @Override
  public List<Direktkandidat> getZugelasseneDirektkandidaten() {
    return ergebnisDaten.getZugelasseneDirektkandidaten();
  }

  @Override
  public List<Direktkandidat> getZugelasseneDirektkandidatenZuGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getZugelasseneDirektkandidatenZuGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public List<Gruppe> getGruppenZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getGruppenZugelassenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public List<Gruppe> getGruppenMitDirektkandidatZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getGruppenMitDirektkandidatZugelassenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public List<Gruppe> getGruppenMitListeZugelassenSortiertNachPositionAufGebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getGruppenMitListeZugelassenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet);
  }

  @Override
  public Map<Gruppe, List<ReferendumOption>> getReferendumOptionenNachReferendumVorlage() {
    return ergebnisDaten.getReferendumOptionenNachReferendumVorlage();
  }

  @Override
  public List<ReferendumOption> getReferendumOptionenEinerVorlageSortiertNachPosition(Gruppe referendumVorlage) {
    return ergebnisDaten.getReferendumOptionenSortiertNachPosition(referendumVorlage);
  }

  @Override
  public Long getStimmenFuerReferendumOption(ReferendumOption referendumOption, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErgebnisDatenReferendumOptionen().getStimmenFuerReferendumOption(referendumOption, wahldurchfuehrungsgebiet);
  }

  @Override
  public Long getGueltigeFuerReferendumVorlage(Gruppe vorlage, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErgebnisDatenReferendumOptionen().getStimmenFuerReferendumOptionenGueltig(vorlage, wahldurchfuehrungsgebiet);
  }

  @Override
  public Long getUngueltigeFuerReferendumVorlage(Gruppe vorlage, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getErgebnisDatenReferendumOptionen().getStimmenFuerReferendumOptionenUngueltig(vorlage, wahldurchfuehrungsgebiet);
  }
}
