
package de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium;

import java.util.Collection;
import java.util.Date;

import de.ivu.elect.business.person.entity.Personendaten;

public class MindestalterAmStichtagKriterium extends AbstractAlterAmStichtagKriterium {

  private static final long serialVersionUID = 1L;

  private static final String KRITERIUM_WAHLTAG = "MindestalterAmStichtagKriterium.DatumWahltag.description";

  private static final String KRITERIUM_X_TAGE_VORM_WAHLTAG = "MindestalterAmStichtagKriterium.DatumXTageVormWahltag.description";

  private static final String KRITERIUM_TAG_DER_UNTERSCHRIFT = "MindestalterAmStichtagKriterium.DatumUnterschrift.description";

  private static final String KRITERIUM_TAG_DER_PRUEFUNG = "MindestalterAmStichtagKriterium.DatumPruefung.description";

  public MindestalterAmStichtagKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag, int mindestalterInJahren, String descriptionMsgKey) {
    this(personendatenClasses, stichtag, 0, mindestalterInJahren, descriptionMsgKey);
  }

  public MindestalterAmStichtagKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag, int anzahlTageVormStichtag, int mindestalterInJahren,
      String descriptionMsgKey) {
    super(personendatenClasses, stichtag, anzahlTageVormStichtag, mindestalterInJahren, descriptionMsgKey);
  }

  public int getMindestalterInJahren() {
    return getAlterInJahren();
  }

  @Override
  public boolean isStichtagWahltag() {
    return KRITERIUM_WAHLTAG.equals(getDescriptionMsgKey());
  }

  @Override
  public boolean isStichtagXTageVormWahltag() {
    return KRITERIUM_X_TAGE_VORM_WAHLTAG.equals(getDescriptionMsgKey());
  }

  @Override
  public boolean isStichtagTagDerUnterschrift() {
    return KRITERIUM_TAG_DER_UNTERSCHRIFT.equals(getDescriptionMsgKey());
  }

  @Override
  public boolean isStichtagTagDerPruefung() {
    return KRITERIUM_TAG_DER_PRUEFUNG.equals(getDescriptionMsgKey());
  }

  @Override
  protected boolean matchesInternal(int alterInJahren) {
    return alterInJahren >= getMindestalterInJahren();
  }

  public static MindestalterAmStichtagKriterium createMindestalterAmWahltagKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag, int mindestalterInJahren) {
    return new MindestalterAmStichtagKriterium(personendatenClasses, stichtag, mindestalterInJahren, KRITERIUM_WAHLTAG);
  }

  public static MindestalterAmStichtagKriterium createMindestalterAmXtenTagVormWahltagKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag,
      int anzahlTageVormStichtag, int mindestalterInJahren) {
    return new MindestalterAmStichtagKriterium(personendatenClasses, stichtag, anzahlTageVormStichtag, mindestalterInJahren, KRITERIUM_X_TAGE_VORM_WAHLTAG);
  }

  public static MindestalterAmStichtagKriterium createMindestalterAmTagDerUnterschriftKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag,
      int mindestalterInJahren) {
    return new MindestalterAmStichtagKriterium(personendatenClasses, stichtag, mindestalterInJahren, KRITERIUM_TAG_DER_UNTERSCHRIFT);
  }

  public static MindestalterAmStichtagKriterium createMindestalterAmTagDerPruefungKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag, int mindestalterInJahren) {
    return new MindestalterAmStichtagKriterium(personendatenClasses, stichtag, mindestalterInJahren, KRITERIUM_TAG_DER_PRUEFUNG);
  }
}
