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

import java.util.Date;
import java.util.function.BiFunction;

/**
 *  on 18.11.2016.
 */
public enum DateExtremum {
  JUENGSTER() {

    @Override
    public Kandidat select(Kandidat x, Kandidat y) {
      return DateExtremum.getJuengerenVon(x, y);
    }
  },

  AELTESTER() {

    @Override
    public Kandidat select(Kandidat x, Kandidat y) {
      return DateExtremum.getAelterenVon(x, y);
    }
  };

  private static Kandidat getJuengerenVon(Kandidat x, Kandidat y) {
    return mitMaximalemOderMinimalemGeburtsdatum(x, y, Date::after);
  }

  private static Kandidat getAelterenVon(Kandidat x, Kandidat y) {
    return mitMaximalemOderMinimalemGeburtsdatum(x, y, Date::before);
  }

  /**
   * Liefert - abhängig von minOrMax - den jüngeren oder älteren der beiden Kandidaten. Wenn einer kein Geburtsdatum
   * hat, wird in jedem Fall der andere zurückgegeben.
   *
   * @return den älteren oder jüngeren der beiden Kandidaten
   */
  private static Kandidat mitMaximalemOderMinimalemGeburtsdatum(Kandidat x, Kandidat y,
      BiFunction<Date, Date, Boolean> minOrMax) {
    Date xGeburtsdatum = x.getGeburtsdatum();
    Date yGeburtsdatum = y.getGeburtsdatum();
    if (xGeburtsdatum == null) {
      return y;
    } else if (yGeburtsdatum == null) {
      return x;
    }
    if (minOrMax.apply(xGeburtsdatum, yGeburtsdatum)) {
      return x;
    } else {
      return y;
    }
  }

  public abstract Kandidat select(Kandidat x, Kandidat y);
}
