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

import java.util.Objects;

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

public class ErgebnisZusammenstellungEingabe {

  private final String kennung;

  private final Stimmenart stimmenart;

  private final long anzahl;

  private final long anzahlVorlaeufig;

  private final long anzahlEndgueltig;

  private final long anzahlVorperiode;

  public ErgebnisZusammenstellungEingabe(String kennung, Stimmenart stimmenart, Long anzahl) {
    this(kennung, stimmenart, anzahl, 0L, 0L, 0L);
  }

  private ErgebnisZusammenstellungEingabe(String kennung, Stimmenart stimmenart, Long anzahl, Long anzahlVorlaeufig, Long anzahlEndgueltig, Long anzahlVorperiode) {
    super();

    this.kennung = kennung;

    this.stimmenart = stimmenart;

    this.anzahl = fixNullToZero(anzahl);

    this.anzahlVorlaeufig = fixNullToZero(anzahlVorlaeufig);
    this.anzahlEndgueltig = fixNullToZero(anzahlEndgueltig);

    this.anzahlVorperiode = fixNullToZero(anzahlVorperiode);
  }

  public String getKennung() {
    return kennung;
  }

  public Stimmenart getStimmenart() {
    return stimmenart;
  }

  public long getAnzahl() {
    return anzahl;
  }

  private long getAnzahlVorlaeufig() {
    return anzahlVorlaeufig;
  }

  private long getAnzahlEndgueltig() {
    return anzahlEndgueltig;
  }

  private long getAnzahlVorperiode() {
    return anzahlVorperiode;
  }

  public ErgebnisZusammenstellungEingabe add(ErgebnisZusammenstellungEingabe another) {
    return new ErgebnisZusammenstellungEingabe( //
        Objects.equals(getKennung(), another.getKennung()) ? getKennung() : "", //

        Objects.equals(getStimmenart(), another.getStimmenart()) ? getStimmenart() : Stimmenart.GESAMT, //

        getAnzahl() + another.getAnzahl(), //

        getAnzahlVorlaeufig() + another.getAnzahlVorlaeufig(), //
        getAnzahlEndgueltig() + another.getAnzahlEndgueltig(), //

        getAnzahlVorperiode() + another.getAnzahlVorperiode() //
    );
  }

  long fixNullToZero(Long value) {
    return fixNullToDefault(value, 0L);
  }

  long fixNullToDefault(Long value, long defaultValue) {
    if (value == null) {
      return defaultValue;
    }

    return value;
  }
}
