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

import java.util.function.Predicate;

import static java.util.Arrays.asList;

/**
 *  on 10.11.2016.
 */
public enum KandidatArtFilter {
  NUR_DIREKT {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> KandidatArt.NUR_DIREKT.equals(k.getKandidatArt());
    }
  },

  NUR_LISTE {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> KandidatArt.NUR_LISTE.equals(k.getKandidatArt());
    }
  },

  NUR_ERSATZ {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> KandidatArt.NUR_ERSATZ.equals(k.getKandidatArt());
    }
  },

  DIREKT {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> k.isDirektkandidat();
    }
  },

  LISTE {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> k.isListenkandidat();
    }
  },

  ERSATZ {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> k.isErsatzkandidat();
    }
  },

  DOPPELBEWERBER {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> KandidatArt.DOPPELBEWERBER.equals(k.getKandidatArt());
    }
  },

  DOPPELBEWERBER_ALS_EINZEL_UND_LANDESLISTENBEWERBER {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> KandidatArt.DOPPELBEWERBER_ALS_EINZEL_UND_LANDESLISTENBEWERBER.equals(k.getKandidatArt());
    }
  },

  DOPPELBEWERBER_GESAMT {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> asList(KandidatArt.DOPPELBEWERBER, KandidatArt.DOPPELBEWERBER_ALS_EINZEL_UND_LANDESLISTENBEWERBER).contains(k.getKandidatArt());
    }
  },

  MEHRERE_LISTEN {

        @Override
        public Predicate<Kandidat> filterKandidaten() {
            return k -> k.isAufMehrerenListen();
        }
    },

    INSGESAMT {

    @Override
    public Predicate<Kandidat> filterKandidaten() {
      return k -> true;
    }
  };

  public abstract Predicate<Kandidat> filterKandidaten();
}
