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

import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;
import java.util.Objects;

public class ErfassteStimmzettelStatistik {

  public static final ErfassteStimmzettelStatistik EMPTY = new ErfassteStimmzettelStatistik(Collections.emptyMap(), null);

  private final Map<StimmzettelTeam, Map<StimmzettelGueltigkeit, Long>> statistik;

  private final Long anzahlNochZuErfassenderStimmzettel;

  public ErfassteStimmzettelStatistik(Map<StimmzettelTeam, Map<StimmzettelGueltigkeit, Long>> statistik, Long anzahlNochZuErfassenderStimmzettel) {
    this.statistik = statistik;
    this.anzahlNochZuErfassenderStimmzettel = anzahlNochZuErfassenderStimmzettel;
  }

  public Map<StimmzettelTeam, Map<StimmzettelGueltigkeit, Long>> getStatistikProTeam() {
    return statistik;
  }

  public Map<StimmzettelGueltigkeit, Long> getStatistikGesamt() {

    Map<StimmzettelGueltigkeit, Long> result = new EnumMap<>(StimmzettelGueltigkeit.class);

    for (Map<StimmzettelGueltigkeit, Long> proTeam : statistik.values()) {
      for (Map.Entry<StimmzettelGueltigkeit, Long> entry : proTeam.entrySet()) {
        if (entry.getValue() != null) {
          result.put(entry.getKey(), result.getOrDefault(entry.getKey(), 0L) + entry.getValue());
        }
      }
    }

    return result;
  }

  public Long getAnzahlNochZuErfassenderStimmzettel() {
    return anzahlNochZuErfassenderStimmzettel;
  }

  public long getAnzahlErfassteStimmzettelGesamt() {
    return statistik.values().stream().flatMap(value -> value.values().stream()).filter(Objects::nonNull).mapToLong(aLong -> aLong).sum();
  }
}

