
package de.ivu.elect.was.exchange.ergebnis.zusammenstellung;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;

public class ErgebnisZusammenstellungWahlberechtigte {

  private final ErgebnisZusammenstellungEingabe anzahlOhneWahlschein;

  private final ErgebnisZusammenstellungEingabe anzahlMitWahlschein;

  private final ErgebnisZusammenstellungEingabe anzahlNichtImWaehlerverzeichnis;

  private final ErgebnisZusammenstellungEingabe anzahlGesamtInklusiveNichtImWaehlerverzeichnis;

  private final ErgebnisZusammenstellungEingabe anzahlGesamtExklusiveNichtImWaehlerverzeichnis;

  private final ErgebnisZusammenstellungEingabe anzahlGesamt;

  public ErgebnisZusammenstellungWahlberechtigte( //
      String anzahlOhneWahlscheinKennung, Long anzahlOhneWahlschein, //
      String anzahlMitWahlscheinKennung, Long anzahlMitWahlschein, //
      String anzahlNichtImWaehlerverzeichnisKennung, Long anzahlNichtImWaehlerverzeichnis, //
      String anzahlGesamtKennung, Long anzahlGesamtInklusiveNichtImWaehlerverzeichnis, Long anzahlGesamtExklusiveNichtImWaehlerverzeichnis, Long anzahlGesamt //
  ) {
    this( //
        new ErgebnisZusammenstellungEingabe(anzahlOhneWahlscheinKennung, Stimmenart.OHNE_WAHLSCHEIN, anzahlOhneWahlschein), //
        new ErgebnisZusammenstellungEingabe(anzahlMitWahlscheinKennung, Stimmenart.MIT_WAHLSCHEIN, anzahlMitWahlschein), //
        new ErgebnisZusammenstellungEingabe(anzahlNichtImWaehlerverzeichnisKennung, Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS, anzahlNichtImWaehlerverzeichnis), //
        new ErgebnisZusammenstellungEingabe(anzahlGesamtKennung, Stimmenart.GESAMT, anzahlGesamtInklusiveNichtImWaehlerverzeichnis),
        new ErgebnisZusammenstellungEingabe(anzahlGesamtKennung, Stimmenart.GESAMT, anzahlGesamtExklusiveNichtImWaehlerverzeichnis),
        new ErgebnisZusammenstellungEingabe(anzahlGesamtKennung, Stimmenart.GESAMT, anzahlGesamt) //
    );
  }

  private ErgebnisZusammenstellungWahlberechtigte(ErgebnisZusammenstellungEingabe anzahlOhneWahlschein, ErgebnisZusammenstellungEingabe anzahlMitWahlschein,
      ErgebnisZusammenstellungEingabe anzahlNichtImWaehlerverzeichnis, ErgebnisZusammenstellungEingabe anzahlGesamtInklusiveNichtImWaehlerverzeichnis,
      ErgebnisZusammenstellungEingabe anzahlGesamtExklusiveNichtImWaehlerverzeichnis, ErgebnisZusammenstellungEingabe anzahlGesamt) {
    super();

    this.anzahlOhneWahlschein = anzahlOhneWahlschein;
    this.anzahlMitWahlschein = anzahlMitWahlschein;
    this.anzahlNichtImWaehlerverzeichnis = anzahlNichtImWaehlerverzeichnis;
    this.anzahlGesamtInklusiveNichtImWaehlerverzeichnis = anzahlGesamtInklusiveNichtImWaehlerverzeichnis;
    this.anzahlGesamtExklusiveNichtImWaehlerverzeichnis = anzahlGesamtExklusiveNichtImWaehlerverzeichnis;
    this.anzahlGesamt = anzahlGesamt;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlOhneWahlschein() {
    return anzahlOhneWahlschein;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlMitWahlschein() {
    return anzahlMitWahlschein;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlNichtImWaehlerverzeichnis() {
    return anzahlNichtImWaehlerverzeichnis;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlGesamtInklusiveNichtImWaehlerverzeichnis() {
    return anzahlGesamtInklusiveNichtImWaehlerverzeichnis;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlGesamtExklusiveNichtImWaehlerverzeichnis() {
    return anzahlGesamtExklusiveNichtImWaehlerverzeichnis;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlGesamt() {
    return anzahlGesamt;
  }

  public ErgebnisZusammenstellungWahlberechtigte add(ErgebnisZusammenstellungWahlberechtigte another) {
    return sum(this, another);
  }

  private static ErgebnisZusammenstellungWahlberechtigte sum(ErgebnisZusammenstellungWahlberechtigte one, ErgebnisZusammenstellungWahlberechtigte another) {
    return new ErgebnisZusammenstellungWahlberechtigte( //
        one.getAnzahlOhneWahlschein().add(another.getAnzahlOhneWahlschein()), //
        one.getAnzahlMitWahlschein().add(another.getAnzahlMitWahlschein()), //
        one.getAnzahlNichtImWaehlerverzeichnis().add(another.getAnzahlNichtImWaehlerverzeichnis()), //
        one.getAnzahlGesamtInklusiveNichtImWaehlerverzeichnis().add(another.getAnzahlGesamtInklusiveNichtImWaehlerverzeichnis()), //
        one.getAnzahlGesamtExklusiveNichtImWaehlerverzeichnis().add(another.getAnzahlGesamtExklusiveNichtImWaehlerverzeichnis()), //
        one.getAnzahlGesamt().add(another.getAnzahlGesamt()) //
    );
  }
}
