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

import java.util.ArrayList;
import java.util.List;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

public class StimmenhochrechnerGebietAusgabedaten {
  private final Gebiet gebiet;
  private GebietDaten<Double> vorperiodeAnteile;
  private GebietDaten<Double> aktuellAnteile;
  private GebietDaten<Double> hochgerechnetAnteile;
  private GebietDaten<Long> vorperiodeAnzahlen;
  private GebietDaten<Long> aktuellAnzahlen;
  private GebietDaten<Long> hochgerechnetAnzahlen;
  private GebietDaten<Double> abweichungAktuellVonHochgerechnet;

  private final KoordinatenInformationen koordinatenInformationen;

  private List<GewichtetesObject<Gebiet>> abstaendeZuAnderenGebieten;

  public StimmenhochrechnerGebietAusgabedaten(Gebiet gebiet, KoordinatenInformationen koordinatenInformationen) {
    this.gebiet = gebiet;
    this.koordinatenInformationen = koordinatenInformationen;
    this.abstaendeZuAnderenGebieten = new ArrayList<>();
  }

  public Gebiet getGebiet() {
    return gebiet;
  }

  public GebietDaten<Double> getVorperiodeAnteile() {
    return vorperiodeAnteile;
  }

  public GebietDaten<Double> getAktuellAnteile() {
    return aktuellAnteile;
  }

  public GebietDaten<Double> getHochgerechnetAnteile() {
    return hochgerechnetAnteile;
  }

  public GebietDaten<Long> getVorperiodeAnzahlen() {
    return vorperiodeAnzahlen;
  }

  public GebietDaten<Long> getAktuellAnzahlen() {
    return aktuellAnzahlen;
  }

  public void setVorperiodeAnteile(GebietDaten<Double> vorperiodeAnteile) {
    this.vorperiodeAnteile = vorperiodeAnteile;
  }

  public void setAktuellAnteile(GebietDaten<Double> aktuellAnteile) {
    this.aktuellAnteile = aktuellAnteile;
  }

  public void setHochgerechnetAnteile(GebietDaten<Double> hochgerechnetAnteile) {
    this.hochgerechnetAnteile = hochgerechnetAnteile;
  }

  public void setVorperiodeAnzahlen(GebietDaten<Long> vorperiodeAnzahlen) {
    this.vorperiodeAnzahlen = vorperiodeAnzahlen;
  }

  public void setAktuellAnzahlen(GebietDaten<Long> aktuellAnzahlen) {
    this.aktuellAnzahlen = aktuellAnzahlen;
  }

  public KoordinatenInformationen getKoordinatenInformationen() {
    return koordinatenInformationen;
  }

  public List<GewichtetesObject<Gebiet>> getAbstaendeZuAnderenGebieten() {
    return abstaendeZuAnderenGebieten;
  }

  public void setAbstaendeZuAnderenGebieten(List<GewichtetesObject<Gebiet>> abstaendeZuAnderenGebieten) {
    this.abstaendeZuAnderenGebieten = abstaendeZuAnderenGebieten;
  }

  public GebietDaten<Long> getHochgerechnetAlsAnzahlen(AnzahlStimmenProWaehlerNachStimmenartBestimmer anzahlStimmenProWaehlerBestimmer) {
    if (hochgerechnetAnteile == null) {
      return null;
    }
    hochgerechnetAnzahlen = new GebietDatenMitStimmenAnzahlen(hochgerechnetAnteile, anzahlStimmenProWaehlerBestimmer);
    return hochgerechnetAnzahlen;
  }

  public GebietDaten<Double> getAbweichungAktuellVonHochgerechnet() {
    if (abweichungAktuellVonHochgerechnet == null) {
      abweichungAktuellVonHochgerechnet = new GebietDatenAbweichung(aktuellAnteile, hochgerechnetAnteile, koordinatenInformationen);
    }
    return abweichungAktuellVonHochgerechnet;
  }
}
