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

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
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.hochrechnung.entity.ReferendumFrage;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;

public class GebietDatenVonVorperiodeErgebnisdaten extends GebietDatenVonErgebnisdaten {

  /**
   * VORSICHT!
   * @param  ergebnisDatenAktuelleWahl ist das aktuelle Ergebnis und man muss explizit die Vorperiode aufrufen
   *                                   z. B. ergebnisDatenAktuelleWahl.getZweitstimmenVorperiodeGueltige und nicht ergebnisDatenAktuelleWahl.getZweitstimmenAktuellGueltige
   */
  public GebietDatenVonVorperiodeErgebnisdaten(Wahldurchfuehrungsgebiet gebiet, ErgebnisDaten ergebnisDatenAktuelleWahl) {
    super(gebiet, ergebnisDatenAktuelleWahl);
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getWahlberechtigteOhneWahlscheinSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWahlberechtigteOhneWahlscheinVorperiodeFuerErfassungsgebietUnterhalbVon;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getWahlberechtigteMitWahlscheinSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWahlberechtigteMitWahlscheinVorperiodeFuerErfassungsgebietUnterhalbVon;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getWahlberechtigteNichtImWaehlerverzeichnisSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWahlberechtigteNichtImWaehlerverzeichnisVorperiodeFuerErfassungsgebietUnterhalbVon;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getWahlberechtigteGesamtSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWahlberechtigteGesamtVorperiodeFuerErfassungsgebietUnterhalbVon;
  }

  @Override
  Function<Wahldurchfuehrungsgebiet, Long> getWaehlerOhneWahlscheinSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWaehlerOhneWahlscheinVorperiode;
  }

  @Override
  Function<Wahldurchfuehrungsgebiet, Long> getWaehlerMitWahlscheinSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWaehlerMitWahlscheinVorperiode;
  }

  @Override
  Function<Wahldurchfuehrungsgebiet, Long> getWaehlerGesamtSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getWaehlerGesamtVorperiodeGesamt;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getErststimmenGueltigeSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getErststimmenVorperiodeGueltige;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getZweitstimmenGueltigeSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getZweitstimmenVorperiodeGueltige;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getErststimmenUngueltigeSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getErststimmenVorperiodeUngueltige;
  }

  @Override
  Function<GebietUndStimmabgabeart, Long> getZweitstimmenUngueltigeSupplier(ErgebnisDaten ergebnisDatenAktuelleWahl) {
    return ergebnisDatenAktuelleWahl::getZweitstimmenVorperiodeUngueltige;
  }

  @Override
  Map<PolitischeGruppe, Long> getErstStimmenFuerGebiet(ErgebnisDaten ergebnisDatenAktuell, GebietUndStimmabgabeart gebietUndStimmabgabeart) {
    if (ergebnisDatenAktuell == null || gebietUndStimmabgabeart == null) {
      return new HashMap<>();
    }
    return ergebnisDatenAktuell.getErststimmenVorperiode(gebietUndStimmabgabeart);
  }

  @Override
  Map<PolitischeGruppe, Long> getZweitStimmenFuerGebiet(ErgebnisDaten ergebnisDatenAktuell, GebietUndStimmabgabeart gebietUndStimmabgabeart) {
    if (ergebnisDatenAktuell == null || gebietUndStimmabgabeart == null) {
      return new HashMap<>();
    }
    return ergebnisDatenAktuell.getZweitstimmenVorperiode(gebietUndStimmabgabeart);
  }

  @Override
  Function<PolitischeGruppe, Map<Listenkandidatur, Long>> getListenKandidaturStimmenGetterFuerGebiet(ErgebnisDaten ergebnisDatenAktuell, Wahldurchfuehrungsgebiet gebiet) {
    // Informationen der Listenkandidaturenstimmen der Vorperiode brauchen wir nicht.
    return politischeGruppe -> new HashMap<>();
  }

  @Override
  Map<Gruppe, ReferendumFrage<Long>> extractReferendumFragenVonErgebnisDatenFuerGebiet(ErgebnisDaten ergebnisDatenAktuell, Wahldurchfuehrungsgebiet gebiet) {
    return new HashMap<>(); // Wir haben bisher keinen Zugriff auf Referendum von der Vorperiode
  }
}