
package de.ivu.elect.business.stimmeingabe.control.fiktive;

import java.util.EnumMap;
import java.util.Map;

import javax.annotation.Nullable;

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

public class AnzahlWahlberechtigte {

  private final Map<Stimmenart, Long> map = new EnumMap<>(Stimmenart.class);

  public AnzahlWahlberechtigte() {
    super();
  }

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

  public long getGesamtNonNull() {
    long result = getAnzahlNonNull(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 getOhneWahlscheinNonNull() + getMitWahlscheinNonNull() + getNichtImWaehlerverzeichnisNonNull();
  }

  public long getNichtImWaehlerverzeichnisNonNull() {
    return getAnzahlNonNull(Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS);
  }

  public long getMitWahlscheinNonNull() {
    return getAnzahlNonNull(Stimmenart.MIT_WAHLSCHEIN);
  }

  public long getOhneWahlscheinNonNull() {
    return getAnzahlNonNull(Stimmenart.OHNE_WAHLSCHEIN);
  }

  private long getAnzahlNonNull(Stimmenart stimmenart) {
    return map.getOrDefault(stimmenart, 0L);
  }

  public void setAnzahl(Stimmenart stimmenart, @Nullable Long anzahl) {
    if (anzahl != null) {
      map.put(stimmenart, anzahl);
    }
  }
}
