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

import java.util.Collection;
import java.util.function.Function;
import java.util.function.Predicate;

import de.ivu.elect.business.gruppe.entity.Gruppe;

/**
 *  on 08.11.2016.
 */
public class ParteiFilter implements Predicate<Gruppe> {

  public static final ParteiFilter TRUE = new ParteiFilter(pg -> true);
  public static final ParteiFilter EINZELBEWERBER_WAEHLERGRUPPEN = new ParteiFilter(
      g -> isEinzelbewerberOderWaehlergruppe(g));

  private final Predicate<Gruppe> gruppePredicate;

  public ParteiFilter(Predicate<Gruppe> gruppePredicate) {
    this.gruppePredicate = gruppePredicate;
  }

  public ParteiFilter(Gruppe gruppe) {
    this(Predicate.isEqual(gruppe));
  }

  public static ParteiFilter sonstige(Collection< ? extends Gruppe> grosseParteien) {
    return new ParteiFilter(pg -> !grosseParteien.contains(pg));
  }

  public boolean test(Gruppe gruppe) {
    return gruppePredicate.test(gruppe);
  }

  /**
   * Zum Filtern beliebiger Objekte, die einen Bezug zu einer PolitischenGruppe haben.
   *
   * @param function
   *          stellt den Bezug zu der politischen Gruppe dar
   * @param <T>
   *          Typ der zu filternden Objekte
   * @return ein Prädikat auf T, das über den Bezug zur Politischen Gruppe definiert ist
   */
  public <T> Predicate<T> filter(Function<T, Gruppe> function) {
    return t -> test(function.apply(t));
  }

  private static boolean isEinzelbewerberOderWaehlergruppe(Gruppe gruppe) {
    return gruppe.isEinzelbewerber() || gruppe.isWaehlergruppe();
  }
}
