package de.ivu.elect.business.stimmen.control;

import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.function.Supplier;

import javax.annotation.Nonnull;

import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.gebietsbaum.entity.AbstractGebietsgruppierung;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsgruppierung;


import static java.util.stream.Collectors.toList;

/**
 * Nutzen, siehe WASDE-569
 */
public class ErgebnisStimmenFilter implements Serializable {

  public List<Stimmen> filterStimmen(List<Stimmen> stimmenUngefiltert, Supplier<Set<Gebiet>> erfassteGebiete, Stimmabgabeart stimmabgabeart, Gebietsgruppierung gebietsgruppierung) {
    return stimmenUngefiltert.stream().filter(getFilter(erfassteGebiete, stimmabgabeart, gebietsgruppierung)).collect(toList());
  }

  public boolean filterStimmen(Stimmen stimmen, Predicate<Gebiet> gebietFilter) {
    return gebietFilter.test(stimmen.getGebiet());
  }

  @Nonnull
  protected Predicate<Stimmen> getFilter(Supplier<Set<Gebiet>> erfassteGebiete, Stimmabgabeart stimmabgabeart, Gebietsgruppierung gebietsgruppierung) {
    return stimmabgabeart.filterStimmen(erfassteGebiete).and(getGebietsgruppierungFilter(gebietsgruppierung));
  }

  private Predicate<? super Stimmen> getGebietsgruppierungFilter(Gebietsgruppierung gebietsgruppierung) {
    Predicate<Gebiet> gebietsgruppierungFilter = AbstractGebietsgruppierung.getGebietsgruppierungFilter(gebietsgruppierung);
    return stimmen -> gebietsgruppierungFilter.test(stimmen.getGebiet());
  }

}
