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

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

public class ErgebnisZusammenstellungStimmzettel {

  private final ErgebnisZusammenstellungEingabe direktstimmenGueltig;

  private final ErgebnisZusammenstellungEingabe direktstimmenUngueltig;

  private final ErgebnisZusammenstellungEingabe direktstimmenUnbestimmt;

  private final ErgebnisZusammenstellungEingabe direktstimmenGesamt;

  private final ErgebnisZusammenstellungEingabe listenstimmenGueltig;

  private final ErgebnisZusammenstellungEingabe listenstimmenUngueltig;

  private final ErgebnisZusammenstellungEingabe listenstimmenUnbestimmt;

  private final ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagUnveraendert;

  private final ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagVeraendert;

  private final ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagPanaschiert;

  private final ErgebnisZusammenstellungEingabe listenstimmenKeinEinzelnerWahlvorschlagVeraendert;

  private final ErgebnisZusammenstellungEingabe listenstimmenKeinEinzelnerWahlvorschlagPanaschiert;

  private final ErgebnisZusammenstellungEingabe listenstimmenGesamt;

  public ErgebnisZusammenstellungStimmzettel( //
      String direktstimmenGueltigKennung, Long direktstimmenGueltig, //
      String direktstimmenUngueltigKennung, Long direktstimmenUngueltig, //
      String direktstimmenUnbestimmtKennung, Long direktstimmenUnbestimmt, //
      String direktstimmenGesamtKennung, Long direktstimmenGesamt, //

      String listenstimmenGueltigKennung, Long listenstimmenGueltig, //
      String listenstimmenUngueltigKennung, Long listenstimmenUngueltig, //
      String listenstimmenUnbestimmtKennung, Long listenstimmenUnbestimmt, //
      String listenstimmenNurEinzelnerWahlvorschlagUnveraendertKennung, Long listenstimmenNurEinzelnerWahlvorschlagUnveraendert, //
      String listenstimmenNurEinzelnerWahlvorschlagVeraendertKennung, Long listenstimmenNurEinzelnerWahlvorschlagVeraendert, //
      String listenstimmenNurEinzelnerWahlvorschlagPanaschiertKennung, Long listenstimmenNurEinzelnerWahlvorschlagPanaschiert, //
      String listenstimmenKeinEinzelnerWahlvorschlagVeraendertKennung, Long listenstimmenKeinEinzelnerWahlvorschlagVeraendert, //
      String listenstimmenKeinEinzelnerWahlvorschlagPanaschiertKennung, Long listenstimmenKeinEinzelnerWahlvorschlagPanaschiert, //
      String listenstimmenGesamtKennung, Long listenstimmenGesamt //
  ) {
    this( //
        new ErgebnisZusammenstellungEingabe(direktstimmenGueltigKennung, Stimmenart.DIREKTSTIMME, direktstimmenGueltig), //
        new ErgebnisZusammenstellungEingabe(direktstimmenUngueltigKennung, Stimmenart.DIREKTSTIMME, direktstimmenUngueltig), //
        new ErgebnisZusammenstellungEingabe(direktstimmenUnbestimmtKennung, Stimmenart.DIREKTSTIMME, direktstimmenUnbestimmt), //
        new ErgebnisZusammenstellungEingabe(direktstimmenGesamtKennung, Stimmenart.DIREKTSTIMME, direktstimmenGesamt), //

        new ErgebnisZusammenstellungEingabe(listenstimmenGueltigKennung, Stimmenart.LISTENSTIMME, listenstimmenGueltig), //
        new ErgebnisZusammenstellungEingabe(listenstimmenUngueltigKennung, Stimmenart.LISTENSTIMME, listenstimmenUngueltig), //
        new ErgebnisZusammenstellungEingabe(listenstimmenUnbestimmtKennung, Stimmenart.LISTENSTIMME, listenstimmenUnbestimmt), //
        new ErgebnisZusammenstellungEingabe(listenstimmenNurEinzelnerWahlvorschlagUnveraendertKennung, Stimmenart.LISTENSTIMME_EINZELNER_WAHLVORSCHAG_UNVERAENDERT,
            listenstimmenNurEinzelnerWahlvorschlagUnveraendert), //
        new ErgebnisZusammenstellungEingabe(listenstimmenNurEinzelnerWahlvorschlagVeraendertKennung, Stimmenart.LISTENSTIMME_EINZELNER_WAHLVORSCHAG_VERAENDERT,
            listenstimmenNurEinzelnerWahlvorschlagVeraendert), //
        new ErgebnisZusammenstellungEingabe(listenstimmenNurEinzelnerWahlvorschlagPanaschiertKennung, Stimmenart.LISTENSTIMME_EINZELNER_WAHLVORSCHAG_PANASCHIERT,
            listenstimmenNurEinzelnerWahlvorschlagPanaschiert), //
        new ErgebnisZusammenstellungEingabe(listenstimmenKeinEinzelnerWahlvorschlagVeraendertKennung, Stimmenart.LISTENSTIMME_KEIN_EINZELNER_WAHLVORSCHAG_VERAENDERT,
            listenstimmenKeinEinzelnerWahlvorschlagVeraendert), //
        new ErgebnisZusammenstellungEingabe(listenstimmenKeinEinzelnerWahlvorschlagPanaschiertKennung, Stimmenart.LISTENSTIMME_KEIN_EINZELNER_WAHLVORSCHAG_PANASCHIERT,
            listenstimmenKeinEinzelnerWahlvorschlagPanaschiert), //
        new ErgebnisZusammenstellungEingabe(listenstimmenGesamtKennung, Stimmenart.LISTENSTIMME, listenstimmenGesamt) //
    );
  }

  private ErgebnisZusammenstellungStimmzettel(ErgebnisZusammenstellungEingabe direktstimmenGueltig, ErgebnisZusammenstellungEingabe direktstimmenUngueltig,
      ErgebnisZusammenstellungEingabe direktstimmenUnbestimmt, ErgebnisZusammenstellungEingabe direktstimmenGesamt, ErgebnisZusammenstellungEingabe listenstimmenGueltig,
      ErgebnisZusammenstellungEingabe listenstimmenUngueltig, ErgebnisZusammenstellungEingabe listenstimmenUnbestimmt,
      ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagUnveraendert, ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagVeraendert,
      ErgebnisZusammenstellungEingabe listenstimmenNurEinzelnerWahlvorschlagPanaschiert, ErgebnisZusammenstellungEingabe listenstimmenKeinEinzelnerWahlvorschlagVeraendert,
      ErgebnisZusammenstellungEingabe listenstimmenKeinEinzelnerWahlvorschlagPanaschiert, ErgebnisZusammenstellungEingabe listenstimmenGesamt) {
    super();

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

    this.listenstimmenGueltig = listenstimmenGueltig;
    this.listenstimmenUngueltig = listenstimmenUngueltig;
    this.listenstimmenUnbestimmt = listenstimmenUnbestimmt;
    this.listenstimmenNurEinzelnerWahlvorschlagUnveraendert = listenstimmenNurEinzelnerWahlvorschlagUnveraendert;
    this.listenstimmenNurEinzelnerWahlvorschlagVeraendert = listenstimmenNurEinzelnerWahlvorschlagVeraendert;
    this.listenstimmenNurEinzelnerWahlvorschlagPanaschiert = listenstimmenNurEinzelnerWahlvorschlagPanaschiert;
    this.listenstimmenKeinEinzelnerWahlvorschlagVeraendert = listenstimmenKeinEinzelnerWahlvorschlagVeraendert;
    this.listenstimmenKeinEinzelnerWahlvorschlagPanaschiert = listenstimmenKeinEinzelnerWahlvorschlagPanaschiert;
    this.listenstimmenGesamt = listenstimmenGesamt;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenGueltig() {
    return direktstimmenGueltig;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenUngueltig() {
    return direktstimmenUngueltig;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenUnbestimmt() {
    return direktstimmenUnbestimmt;
  }

  public ErgebnisZusammenstellungEingabe getDirektstimmenGesamt() {
    return direktstimmenGesamt;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenGueltig() {
    return listenstimmenGueltig;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenUngueltig() {
    return listenstimmenUngueltig;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenUnbestimmt() {
    return listenstimmenUnbestimmt;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenNurEinzelnerWahlvorschlagUnveraendert() {
    return listenstimmenNurEinzelnerWahlvorschlagUnveraendert;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenNurEinzelnerWahlvorschlagVeraendert() {
    return listenstimmenNurEinzelnerWahlvorschlagVeraendert;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenNurEinzelnerWahlvorschlagPanaschiert() {
    return listenstimmenNurEinzelnerWahlvorschlagPanaschiert;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenKeinEinzelnerWahlvorschlagVeraendert() {
    return listenstimmenKeinEinzelnerWahlvorschlagVeraendert;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenKeinEinzelnerWahlvorschlagPanaschiert() {
    return listenstimmenKeinEinzelnerWahlvorschlagPanaschiert;
  }

  public ErgebnisZusammenstellungEingabe getListenstimmenGesamt() {
    return listenstimmenGesamt;
  }

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

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

        one.getListenstimmenGueltig().add(another.getListenstimmenGueltig()), //
        one.getListenstimmenUngueltig().add(another.getListenstimmenUngueltig()), //
        one.getListenstimmenUnbestimmt().add(another.getListenstimmenUnbestimmt()), //
        one.getListenstimmenNurEinzelnerWahlvorschlagUnveraendert().add(another.getListenstimmenNurEinzelnerWahlvorschlagUnveraendert()), //
        one.getListenstimmenNurEinzelnerWahlvorschlagVeraendert().add(another.getListenstimmenNurEinzelnerWahlvorschlagVeraendert()), //
        one.getListenstimmenNurEinzelnerWahlvorschlagPanaschiert().add(another.getListenstimmenNurEinzelnerWahlvorschlagPanaschiert()), //
        one.getListenstimmenKeinEinzelnerWahlvorschlagVeraendert().add(another.getListenstimmenKeinEinzelnerWahlvorschlagVeraendert()), //
        one.getListenstimmenKeinEinzelnerWahlvorschlagPanaschiert().add(another.getListenstimmenKeinEinzelnerWahlvorschlagPanaschiert()), //
        one.getListenstimmenGesamt().add(another.getListenstimmenGesamt()) //
    );
  }
}
