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

import java.util.Map;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
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.hochrechnung.control.GebietDatenGanzeZahlenToAnteileConverter;

public class GebietDatenMitStimmenAnteilen implements GebietDaten<Double> {

  private final GebietDaten<Double> gebietDaten;

  public GebietDatenMitStimmenAnteilen(GebietDaten<Long> gebietDatenAlsZahlen) {
    GebietDatenGanzeZahlenToAnteileConverter gebietDatenGanzeZahlenToAnteileConverter = new GebietDatenGanzeZahlenToAnteileConverter();

    Gebiet gebiet = gebietDatenAlsZahlen.getGebiet();
    WahlteilnehmerAnzahl anzahlWahlberechtigteImGebiet = gebietDatenAlsZahlen.getAnzahlWahlberechtigteImGebiet();
    WahlteilnehmerAnzahl anzahlWaehlerImGebiet = gebietDatenAlsZahlen.getAnzahlWaehlerImGebiet();
    Map<Stimmenart, Double> gueltige = gebietDatenGanzeZahlenToAnteileConverter.berechneGueltigeAnteile(gebietDatenAlsZahlen);
    Map<Stimmenart, Double> ungueltige = gebietDatenGanzeZahlenToAnteileConverter.berechneUngueltigeAnteileVonGueltige(gueltige);
    boolean isErgebnisVorhanden = gebietDatenAlsZahlen.isErgebnisVorhanden();
    GebietDatenWahlbeteiligung wahlbeteiligung = gebietDatenAlsZahlen.getWahlbeteiligung();
    Map<PolitischeGruppe, ParteiStimmen<Double>> parteiStimmen = gebietDatenGanzeZahlenToAnteileConverter.berechneParteiStimmenAnteile(gebietDatenAlsZahlen.getParteiStimmen());

    Map<Gruppe, ReferendumFrage<Double>> referendumFragen = gebietDatenGanzeZahlenToAnteileConverter.berechneReferendumFragenStimmenAnteile(gebietDatenAlsZahlen.getReferendumFragen());;

    gebietDaten = createGebietDaten(gebiet, anzahlWahlberechtigteImGebiet, anzahlWaehlerImGebiet, gueltige, ungueltige, isErgebnisVorhanden, wahlbeteiligung, parteiStimmen, referendumFragen);
  }

  private GebietDaten<Double> createGebietDaten(Gebiet gebiet, WahlteilnehmerAnzahl anzahlWahlberechtigteImGebiet, WahlteilnehmerAnzahl anzahlWaehlerImGebiet, Map<Stimmenart, Double> gueltige, Map<Stimmenart, Double> ungueltige, boolean isErgebnisVorhanden, GebietDatenWahlbeteiligung wahlbeteiligung, Map<PolitischeGruppe, ParteiStimmen<Double>> parteiStimmen, Map<Gruppe, ReferendumFrage<Double>> referendumFragen) {
    return new GebietDaten<Double>() {
      @Override
      public Gebiet getGebiet() {
        return gebiet;
      }

      @Override
      public WahlteilnehmerAnzahl getAnzahlWahlberechtigteImGebiet() {
        return anzahlWahlberechtigteImGebiet;
      }

      @Override
      public WahlteilnehmerAnzahl getAnzahlWaehlerImGebiet() {
        return anzahlWaehlerImGebiet;
      }

      @Override
      public Map<Stimmenart, Double> getGueltige() {
        return gueltige;
      }

      @Override
      public Map<Stimmenart, Double> getUngueltige() {
        return ungueltige;
      }

      @Override
      public boolean isErgebnisVorhanden() {
        return isErgebnisVorhanden;
      }

      @Override
      public GebietDatenWahlbeteiligung getWahlbeteiligung() {
        return wahlbeteiligung;
      }

      @Override
      public Map<PolitischeGruppe, ParteiStimmen<Double>> getParteiStimmen() {
        return parteiStimmen;
      }

      @Override
      public Map<Gruppe, ReferendumFrage<Double>> getReferendumFragen() {
        return referendumFragen;
      }
    };
  }

  @Override
  public Gebiet getGebiet() {
    return gebietDaten.getGebiet();
  }

  @Override
  public WahlteilnehmerAnzahl getAnzahlWahlberechtigteImGebiet() {
    return gebietDaten.getAnzahlWahlberechtigteImGebiet();
  }

  @Override
  public WahlteilnehmerAnzahl getAnzahlWaehlerImGebiet() {
    return gebietDaten.getAnzahlWaehlerImGebiet();
  }

  @Override
  public Map<Stimmenart, Double> getGueltige() {
    return gebietDaten.getGueltige();
  }

  @Override
  public Map<Stimmenart, Double> getUngueltige() {
    return gebietDaten.getUngueltige();
  }

  @Override
  public boolean isErgebnisVorhanden() {
    return gebietDaten.isErgebnisVorhanden();
  }

  @Override
  public GebietDatenWahlbeteiligung getWahlbeteiligung() {
    return gebietDaten.getWahlbeteiligung();
  }

  @Override
  public Map<PolitischeGruppe, ParteiStimmen<Double>> getParteiStimmen() {
    return gebietDaten.getParteiStimmen();
  }

  @Override
  public Map<Gruppe, ReferendumFrage<Double>> getReferendumFragen() {
    return gebietDaten.getReferendumFragen();
  }
}
