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

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

import javax.annotation.Nullable;

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

public abstract class WahlteilnehmerInfo<N extends Number> {
  final Map<Stimmenart, N> map = new EnumMap<>(Stimmenart.class);

  public N getAnzahl(Stimmenart stimmenart) {
    return map.get(stimmenart);
  }

  public N getAnzahlNotNull(Stimmenart stimmenart) {
    return map.getOrDefault(stimmenart, getZero());
  }

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

  public N getNichtImWaehlerverzeichnis() {
    return getAnzahl(Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS);
  }

  public N getMitWahlschein() {
    return getAnzahl(Stimmenart.MIT_WAHLSCHEIN);
  }

  public N getOhneWahlschein() {
    return getAnzahl(Stimmenart.OHNE_WAHLSCHEIN);
  }

  public N getGesamt() {
    return getAnzahl(Stimmenart.GESAMT);
  }

  public N getNichtImWaehlerverzeichnisNotNull() {
    return getAnzahlNotNull(Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS);
  }

  public N getMitWahlscheinNotNull() {
    return getAnzahlNotNull(Stimmenart.MIT_WAHLSCHEIN);
  }

  public N getOhneWahlscheinNotNull() {
    return getAnzahlNotNull(Stimmenart.OHNE_WAHLSCHEIN);
  }

  public N getGesamtNotNull() {
    return getAnzahlNotNull(Stimmenart.GESAMT);
  }

  public abstract N getZero();

  public Set<Stimmenart> getStimmenarten() {
    return map.keySet();
  }
}
