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

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

public class ErgebnisZusammenstellungWaehler {

  private final ErgebnisZusammenstellungEingabe anzahlOhneWahlschein;

  private final ErgebnisZusammenstellungEingabe anzahlMitWahlschein;

  private final ErgebnisZusammenstellungEingabe anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl;

  private final ErgebnisZusammenstellungEingabe anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl;

  private final ErgebnisZusammenstellungEingabe anzahlGesamt;

  public ErgebnisZusammenstellungWaehler( //
      String anzahlOhneWahlscheinKennung, Long anzahlOhneWahlschein, //
      String anzahlMitWahlscheinKennung, Long anzahlMitWahlschein, //
      String anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahlKennung, Long anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl, //
      String anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahlKennung, Long anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl, //
      String anzahlGesamtKennung, Long anzahlGesamt //
  ) {
    this( //
        new ErgebnisZusammenstellungEingabe(anzahlOhneWahlscheinKennung, Stimmenart.OHNE_WAHLSCHEIN, anzahlOhneWahlschein), //
        new ErgebnisZusammenstellungEingabe(anzahlMitWahlscheinKennung, Stimmenart.MIT_WAHLSCHEIN, anzahlMitWahlschein), //
        new ErgebnisZusammenstellungEingabe(anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahlKennung, Stimmenart.ALS_BRIEFWAHL_IN_URNE, anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl), //
        new ErgebnisZusammenstellungEingabe(anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahlKennung, Stimmenart.ALS_URNENWAHL_IN_URNE, anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl), //
        new ErgebnisZusammenstellungEingabe(anzahlGesamtKennung, Stimmenart.GESAMT, anzahlGesamt) //
    );
  }

  private ErgebnisZusammenstellungWaehler(ErgebnisZusammenstellungEingabe anzahlOhneWahlschein, ErgebnisZusammenstellungEingabe anzahlMitWahlschein,
      ErgebnisZusammenstellungEingabe anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl, ErgebnisZusammenstellungEingabe anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl,
      ErgebnisZusammenstellungEingabe anzahlGesamt) {
    super();

    this.anzahlOhneWahlschein = anzahlOhneWahlschein;
    this.anzahlMitWahlschein = anzahlMitWahlschein;
    this.anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl = anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl;
    this.anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl = anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl;
    this.anzahlGesamt = anzahlGesamt;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlOhneWahlschein() {
    return anzahlOhneWahlschein;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlMitWahlschein() {
    return anzahlMitWahlschein;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl() {
    return anzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl() {
    return anzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl;
  }

  public ErgebnisZusammenstellungEingabe getAnzahlGesamt() {
    return anzahlGesamt;
  }

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

  private static ErgebnisZusammenstellungWaehler sum(ErgebnisZusammenstellungWaehler one, ErgebnisZusammenstellungWaehler another) {
    return new ErgebnisZusammenstellungWaehler( //
        one.getAnzahlOhneWahlschein().add(another.getAnzahlOhneWahlschein()), //
        one.getAnzahlMitWahlschein().add(another.getAnzahlMitWahlschein()), //
        one.getAnzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl().add(another.getAnzahlMitWahlscheinInUrnenwahlAnzahlAusBriefwahl()), //
        one.getAnzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl().add(another.getAnzahlMitWahlscheinInUrnenwahlAnzahlAusUrnenwahl()), //
        one.getAnzahlGesamt().add(another.getAnzahlGesamt()) //
    );
  }
}
