package de.ivu.elect.presentation.benutzerverwaltung.form;

import java.util.regex.Pattern;

import javax.enterprise.context.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzortProperties;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;


import static de.ivu.elect.jee.faces.FacesMessageUtil.createErrorMessage;

@RequestScoped
public class BenutzerEinsatzortViewFormBuilder extends AbstractEntityMitRollenViewFormBuilder {

  @Inject
  private BenutzerEinsatzortUniqueUKFacesValidator benutzerEinsatzortUniqueUKFacesValidator;

  public void addProperties(FormBuilder formBuilder, BenutzerEinsatzort benutzerEinsatzort) {

    BenutzerEinsatzortProperties properties = benutzerEinsatzort.getProperties();
    formBuilder.addProperty(properties.getNameProperty()).withValidatorAndPk(benutzerEinsatzortUniqueUKFacesValidator, benutzerEinsatzort.getPk());
    formBuilder.addProperty(properties.getBemerkungProperty());
    addBesonderheitProperty(formBuilder, properties);
    formBuilder.addProperty(properties.getClientIpMusterProperty()).withValidator(new Validator() {
      @Override
      public void validate(FacesContext facesContext, UIComponent uiComponent, Object o) throws ValidatorException {
        if (o == null || StringUtils.isBlank(o.toString())) {
          return;
        }
        try {
          Pattern.compile(o.toString());
        } catch (Exception e) {
          throw new ValidatorException(
              createErrorMessage(facesContext, "regexp.validation.failed", "regexp.validation.failed.detail", o, e.getLocalizedMessage()));
        }

      }
    });

    addRolleProperties(formBuilder, benutzerEinsatzort.getRolles(), benutzerEinsatzort.getMandant());
  }

  protected void addBesonderheitProperty(FormBuilder formBuilder, BenutzerEinsatzortProperties properties) {
    formBuilder.addProperty(properties.getBesonderheitProperty());
  }

  @Override
  protected boolean isGruppenUebernehmen(Mandant mandant) {
    return false; // Gruppen manuell setzen
  }
}
