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

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

public class ErgebnisZusammenstellungStimmen {

  private final ErgebnisZusammenstellungEingabe direktstimmenGueltig;

  private final ErgebnisZusammenstellungEingabe direktstimmenUngueltig;

  private final ErgebnisZusammenstellungEingabe direktstimmenGesamt;

  private final ErgebnisZusammenstellungEingabe listenstimmenGueltig;

  private final ErgebnisZusammenstellungEingabe listenstimmenUngueltig;

  private final ErgebnisZusammenstellungEingabe listenstimmenGesamt;

  public ErgebnisZusammenstellungStimmen( //
      String direktstimmenGueltigKennung, Long direktstimmenGueltig, //
      String direktstimmenUngueltigKennung, Long direktstimmenUngueltig, //
      String direktstimmenGesamtKennung, Long direktstimmenGesamt, //

      String listenstimmenGueltigKennung, Long listenstimmenGueltig, //
      String listenstimmenUngueltigKennung, Long listenstimmenUngueltig, //
      String listenstimmenGesamtKennung, Long listenstimmenGesamt //
  ) {
    this( //
        new ErgebnisZusammenstellungEingabe(direktstimmenGueltigKennung, Stimmenart.DIREKTSTIMME, direktstimmenGueltig), //
        new ErgebnisZusammenstellungEingabe(direktstimmenUngueltigKennung, Stimmenart.DIREKTSTIMME, direktstimmenUngueltig), //
        new ErgebnisZusammenstellungEingabe(direktstimmenGesamtKennung, Stimmenart.DIREKTSTIMME, direktstimmenGesamt), //

        new ErgebnisZusammenstellungEingabe(listenstimmenGueltigKennung, Stimmenart.LISTENSTIMME, listenstimmenGueltig), //
        new ErgebnisZusammenstellungEingabe(listenstimmenUngueltigKennung, Stimmenart.LISTENSTIMME, listenstimmenUngueltig), //
        new ErgebnisZusammenstellungEingabe(listenstimmenGesamtKennung, Stimmenart.LISTENSTIMME, listenstimmenGesamt) //
    );
  }

  private ErgebnisZusammenstellungStimmen(ErgebnisZusammenstellungEingabe direktstimmenGueltig, ErgebnisZusammenstellungEingabe direktstimmenUngueltig,
      ErgebnisZusammenstellungEingabe direktstimmenGesamt, ErgebnisZusammenstellungEingabe listenstimmenGueltig, ErgebnisZusammenstellungEingabe listenstimmenUngueltig,
      ErgebnisZusammenstellungEingabe listenstimmenGesamt) {
    super();

    this.direktstimmenGueltig = direktstimmenGueltig;
    this.direktstimmenUngueltig = direktstimmenUngueltig;
    this.direktstimmenGesamt = direktstimmenGesamt;

    this.listenstimmenGueltig = listenstimmenGueltig;
    this.listenstimmenUngueltig = listenstimmenUngueltig;
    this.listenstimmenGesamt = listenstimmenGesamt;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenGueltig() {
    return direktstimmenGueltig;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenUngueltig() {
    return direktstimmenUngueltig;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenGesamt() {
    return direktstimmenGesamt;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenGueltig() {
    return listenstimmenGueltig;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenUngueltig() {
    return listenstimmenUngueltig;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenGesamt() {
    return listenstimmenGesamt;
  }

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

  private static ErgebnisZusammenstellungStimmen sum(ErgebnisZusammenstellungStimmen one, ErgebnisZusammenstellungStimmen another) {
    return new ErgebnisZusammenstellungStimmen( //
        one.getDirektstimmenGueltig().add(another.getDirektstimmenGueltig()), //
        one.getDirektstimmenUngueltig().add(another.getDirektstimmenUngueltig()), //
        one.getDirektstimmenGesamt().add(another.getDirektstimmenGesamt()), //

        one.getListenstimmenGueltig().add(another.getListenstimmenGueltig()), //
        one.getListenstimmenUngueltig().add(another.getListenstimmenUngueltig()), //
        one.getListenstimmenGesamt().add(another.getListenstimmenGesamt()) //
    );
  }
}
