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

import static java.util.Objects.nonNull;
import static java.util.Objects.requireNonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

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

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.AbstractPersonendatenMatcherKriterium;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractAlterAmStichtagKriterium extends AbstractPersonendatenMatcherKriterium implements Comparable<AbstractAlterAmStichtagKriterium> {

  private static final long serialVersionUID = 1L;

  private final Date stichtag;

  private final Integer alterInJahren;

  private final String descriptionMsgKey;

  private final int anzahlTageVormStichtag;

  protected AbstractAlterAmStichtagKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses, Date stichtag, int anzahlTageVormStichtag, int alterInJahren, String descriptionMsgKey) {
    super(personendatenClasses);

    requireNonNull(stichtag, "Stichtag darf nicht null sein");

    this.stichtag = stichtag;
    this.anzahlTageVormStichtag = anzahlTageVormStichtag;

    this.alterInJahren = alterInJahren;

    this.descriptionMsgKey = descriptionMsgKey;
  }

  public Date getStichtag() {
    return stichtag;
  }

  private int getAnzahlTageVormStichtag() {
    return anzahlTageVormStichtag;
  }

  protected int getAlterInJahren() {
    return alterInJahren;
  }

  public abstract boolean isStichtagWahltag();

  public abstract boolean isStichtagXTageVormWahltag();

  public abstract boolean isStichtagTagDerUnterschrift();

  public abstract boolean isStichtagTagDerPruefung();

  @Override
  protected boolean matchesInternal(Personendaten personendaten) {
    return personendaten.hasGeburtsdatum() && matchesInternal(personendaten.getAlter(getStichtag()));
  }

  protected abstract boolean matchesInternal(int alterInJahren);

  @Override
  public String getDescription(Messages messages) {
    return messages.getMessageForMessageKey(getDescriptionMsgKey(), getAlterInJahren(), getStichtag(), getAnzahlTageVormStichtag());
  }

  @Override
  protected String getDescriptionMsgKey() {
    if (isNotBlank(descriptionMsgKey)) {
      return descriptionMsgKey;
    }

    return super.getDescriptionMsgKey();
  }

  @Override
  public int compareTo(AbstractAlterAmStichtagKriterium another) {
    if (nonNull(another)) {
      int comparedByStichtag = this.stichtag.compareTo(another.stichtag);

      if (comparedByStichtag == 0) {
        return this.alterInJahren.compareTo(another.alterInJahren);
      }

      return comparedByStichtag;
    }

    return -1;
  }

  @Override
  public String toString() {
    return getClass().getSimpleName() + " [stichtag = " + getStichtag() + ", alterInJahren = " + getAlterInJahren() + "]";
  }
}
