
package de.ivu.elect.business.person.entity;

import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import javax.faces.application.FacesMessage;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

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

public class NlGeburtsdatumProperty extends StimmbezirkSchluesselProperty {

  private static final String GEBURTSDATUM_ERFASST_DATE_FORMAT_PATTERN = NlPersonendaten.GEBURTSDATUM_ERFASST_DATE_FORMAT_PATTERN;

  private static final String GEBURTSDATUM_ERFASST_REG_EX = NlPersonendaten.GEBURTSDATUM_ERFASST_REG_EX;

  public NlGeburtsdatumProperty(Personendaten personendaten) {
    super(personendaten);

    getValidators().add(createGeburtsdatumRegexValidator(getMessages()));
  }

  @Override
  public int getDefaultMaxLength() {
    return GEBURTSDATUM_ERFASST_DATE_FORMAT_PATTERN.length();
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(PersonendatenConstants.MESSAGE_KEY_GEBURTSDATUM_EINZAHL);
  }

  @Override
  public void setValue(String value) {
    if (entity == null) {
      super.setValue(value);
    } else {
      new NlPersonendaten(entity).setGeburtsdatumErfasst(value);
    }
  }

  public static Validator createGeburtsdatumRegexValidator(Messages messages) {
    return (facesContext, uiComponent, value) -> {
      if (value != null) {
        String valueOrBlank = trimToEmpty(value.toString());

        // Nur gesetzte Werte validieren -> für Pflichtfeld required == true verwenden!
        if (isNotBlank(valueOrBlank) && !valueOrBlank.matches(GEBURTSDATUM_ERFASST_REG_EX)) {
          String errorMessage = messages.getMessageForMessageKey("personendaten.geburtsdatum.format.error");

          throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
        }
      }
    };
  }
}
