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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

public class WesStimmzettelDaten implements Serializable {
  private static final long serialVersionUID = 1L;

  private final Gebiet gebiet;

  private final List<StimmzettelKopfdatum> stimmzettelKopfdaten;

  private final List<Stimmzettel> stimmzettelList;

  private final Long versionsnummer;

  private final Boolean signaturGueltig;

  public WesStimmzettelDaten(Gebiet gebiet, List<StimmzettelKopfdatum> stimmzettelKopfdaten, List<Stimmzettel> stimmzettelList, Long versionsnummer, Boolean signaturGueltig) {
    this.gebiet = gebiet;
    this.stimmzettelKopfdaten = stimmzettelKopfdaten;
    this.stimmzettelList = stimmzettelList;
    this.versionsnummer = versionsnummer;
    this.signaturGueltig = signaturGueltig;
  }

  public List<StimmzettelKopfdatum> getStimmzettelKopfdaten() {
    return stimmzettelKopfdaten;
  }

  public List<StimmzettelKopfdatum> getStimmzettelKopfdatenFuerExport() {
    // ELECTKOM-807 berechnete Werte nicht exportieren
    return stimmzettelKopfdaten.stream()
        .filter(AbstractStimmzettelKopfdatum::isExportieren)
        .collect(Collectors.toCollection(() -> new ArrayList<>(stimmzettelKopfdaten.size())));
  }

  public List<Stimmzettel> getStimmzettelList() {
    return stimmzettelList;
  }

  public Gebiet getGebiet() {
    return gebiet;
  }

  public Boolean getSignaturGueltig() {
    return signaturGueltig;
  }

  public Long getVersionsnummer() {
    return versionsnummer;
  }

  public StimmzettelTeam bestimmeTeam() {
    if (stimmzettelKopfdaten == null || stimmzettelKopfdaten.isEmpty()) {
      return StimmzettelTeam.UNBEKANNT;
    }
    return stimmzettelKopfdaten.stream()
        .filter(stimmzettelKopfdatum -> StimmzettelKopfdatumArt.ERFASSUNGSTEAM.equals(stimmzettelKopfdatum.getStimmzettelKopfdatumArt())).findFirst()
        .map(k -> StimmzettelTeam.valueOf(k.getWert())).orElse(StimmzettelTeam.UNBEKANNT);
  }

  public Map<StimmzettelTeam, Long> getEnthalteneTeamsAnzahlStimmzettel() {
    return stimmzettelList.stream()
        .collect(Collectors.groupingBy(Stimmzettel::getStimmzettelTeam, Collectors.counting()));

  }

  @Override
  public String toString() {
    return "WesStimmzettelDaten{" +
        "gebiet=" + gebiet +
        ", versionsnummer=" + versionsnummer +
        ", stimmzettelKopfdaten=" + stimmzettelKopfdaten.size() +
        ", stimmzettelList=" + stimmzettelList.size() +
        ", signaturGueltig=" + signaturGueltig +
        '}';
  }
}
