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

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;

import java.util.Collection;
import java.util.Objects;
import java.util.function.BiPredicate;
import java.util.function.Predicate;

/**
 *  on 21.11.2016.
 */
public interface BerufsgruppeFilter extends BiPredicate<Kandidat, Ergebnisart> {

  BerufsgruppeFilter TRUE = (k, e) -> true;

  static BerufsgruppeFilter forPrefix(String prefix) {
    return (k, e) -> {
      String berufsschluessel;
      if (e == null) {
        berufsschluessel = k.getBerufsschluessel(); // Wahlbewerber
      } else {
        berufsschluessel = k.getBerufsschluesselVonGewaehlterKandidatur(e); // Wahlbuch
      }
      return berufsschluessel != null && berufsschluessel.startsWith(prefix);
    };
  }

  static BerufsgruppeFilter any(Collection<BerufsgruppeFilter> berufsgruppeFilterCollection) {
    return (k, e) -> berufsgruppeFilterCollection.stream().anyMatch(filter -> filter.test(k, e));
  }

  default BerufsgruppeFilter or(BerufsgruppeFilter other) {
    Objects.requireNonNull(other);
    return (k, e) -> this.test(k, e) || other.test(k, e);
  }

  default BerufsgruppeFilter and(Predicate<Kandidat> other) {
    Objects.requireNonNull(other);
    return (k, e) -> test(k, e) && other.test(k);
  }

  default BerufsgruppeFilter or(Predicate<Kandidat> other) {
    Objects.requireNonNull(other);
    return (k, e) -> test(k, e) || other.test(k);
  }

  default Predicate<Kandidat> getKandidatPredicate(Ergebnisart e) {
    return k -> this.test(k, e);
  }
}
