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

import static java.util.Objects.nonNull;

import java.util.Collection;

import javax.annotation.Nonnull;

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

public abstract class AbstractPersonendatenMatcherKriterium implements PersonendatenMatcherKriterium {

  private static final long serialVersionUID = 1L;

  private final Collection<Class< ? extends Personendaten>> personendatenClasses;

  public AbstractPersonendatenMatcherKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses) {
    super();

    this.personendatenClasses = personendatenClasses;
  }

  @Override
  public Collection<Class< ? extends Personendaten>> getMatchedPersonendatenClasses() {
    return personendatenClasses;
  }

  @Override
  public boolean matchesNot(Personendaten personendaten) {
    return !matches(personendaten);
  }

  @Override
  public boolean matches(Personendaten personendaten) {
    return nonNull(personendaten) && matchesPersonendatenClasses(personendaten) && matchesInternal(personendaten);
  }

  private boolean matchesPersonendatenClasses(Personendaten personendaten) {
    return getMatchedPersonendatenClasses().stream().anyMatch(clazz -> personendaten.isInstanceOf(clazz));
  }

  protected abstract boolean matchesInternal(@Nonnull Personendaten personendaten);

  @Override
  public String getLabel(Messages messages) {
    return messages.getMessageForMessageKey(getLabelMsgKey());
  }

  protected String getLabelMsgKey() {
    return getClass().getSimpleName() + ".label";
  }

  protected String getDescriptionMsgKey() {
    return getClass().getSimpleName() + ".description";
  }
}
