
package de.ivu.elect.dokumente.kandidatur.statistik;

import java.util.List;
import java.util.stream.Collectors;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.control.Wahldaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;

/**
 *  on 08.11.2016.
 */
public class ListenStatistik {

  private final Wahldaten< ? extends Wahl, Gebiet> wahldaten;

  public ListenStatistik(Wahldaten< ? extends Wahl, Gebiet> wahldaten) {
    this.wahldaten = wahldaten;
  }

  public long getAnzahlListen() {
    return wahldaten.getZugelasseneListen().size();
  }

  public long getAnzahlListen(Gebiet gebiet) {
    return wahldaten.getZugelasseneListenZuGebiet(gebiet).size();
  }

  public long getAnzahlListen(ParteiFilter parteiFilter) {
    List<Liste> zugelasseneListen = wahldaten.getZugelasseneListen();
    return filterAndCount(zugelasseneListen, parteiFilter);
  }

  public long getAnzahlListen(Gebiet gebiet, ParteiFilter parteiFilter) {
    return filterAndCount(wahldaten.getZugelasseneListenZuGebiet(gebiet), parteiFilter);
  }

  public long getAnzahlListenInGebietshierarchie(Gebiet gebiet, ParteiFilter parteiFilter) {
    List<Liste> zugelasseneListenInGebietshierarchie = wahldaten.getZugelasseneListen().stream()
        .filter(liste -> liste.getGebiet().isEqualOderUntergebietVon(gebiet)).collect(Collectors.toList());
    return filterAndCount(zugelasseneListenInGebietshierarchie, parteiFilter);
  }

  private long filterAndCount(List<Liste> zugelasseneListen, ParteiFilter parteiFilter) {
    return zugelasseneListen.stream().filter(parteiFilter.filter(Liste::getGruppe)).count();
  }

  public List<Gebiet> getListenwahlgebiete() {
    return wahldaten.getGebiete(Gebiet::isListenwahlgebiet);
  }

}
