package de.ivu.elect.business.hochrechnung.entity;

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

public class WahlteilnehmerAnzahl extends WahlteilnehmerInfo<Long> {

  public boolean hasAnyAnzahlWahlberechtigte() {
    return getGesamtNotNull() > 0;
  }

  @Override
  public Long getGesamt() {
    Long result = getAnzahl(Stimmenart.GESAMT);
    if (result != null) {
      return result;
    }
    if (getOhneWahlschein() != null || getMitWahlschein() != null || getNichtImWaehlerverzeichnis() != null) {
      return summiereOhneWahlscheinMitWahlscheinNichtImWaehlerverzeichnis();
    }
    return null;
  }

  @Override
  public Long getGesamtNotNull() {
    long result = getAnzahlNotNull(Stimmenart.GESAMT);

    if (result == 0L) {
      // NOTE, dass nicht immer die Gesamtzahl separat erfasst wird -- bspw. bei A-Wert-Erfassung an Gebieten
      return summiereOhneWahlscheinMitWahlscheinNichtImWaehlerverzeichnis();
    }

    return result;
  }

  private long summiereOhneWahlscheinMitWahlscheinNichtImWaehlerverzeichnis() {
    return getOhneWahlscheinNotNull() + getMitWahlscheinNotNull() + getNichtImWaehlerverzeichnisNotNull();
  }

  @Override
  public Long getZero() {
    return 0L;
  }

  public void korrigiereWennWaehlerNichtUnterOhneWSErfasstSind() {
    long gesamt = getGesamtNotNull();
    long summe = summiereOhneWahlscheinMitWahlscheinNichtImWaehlerverzeichnis();
    if (summe < gesamt && getOhneWahlscheinNotNull() == 0) {
      setAnzahl(Stimmenart.OHNE_WAHLSCHEIN, gesamt - summe);
    }
  }
}
