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

import java.io.Serializable;
import java.util.Set;

import javax.inject.Inject;

import de.ivu.elect.business.konfiguration.control.SystemGebietsebeneAuswahl;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.mandant.entity.MandantArt;
import de.ivu.elect.business.mandant.entity.MandantProperties;
import de.ivu.elect.business.system.entity.SystemGebietsebene;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;

public class MandantViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient MandantUniqueUKFacesValidator mandantUniqueUKFacesValidator;

  @Inject
  private transient SystemGebietsebeneAuswahl systemGebietsebeneAuswahl;

  public void addProperties(FormBuilder formBuilder, Mandant mandant) {
    formBuilder.withId("MandantProperties");
    MandantProperties properties = mandant.getProperties();
    boolean persistenterSystemMandant = mandant.isPersistent() && mandant.getArt() != null && mandant.getArt().isSystemMandant();
    formBuilder.addProperty(properties.getNummerProperty()).withKey("nummer");
    if (persistenterSystemMandant) {
      formBuilder.readonly();
    } else {
     formBuilder.withValidatorAndPk(mandantUniqueUKFacesValidator, mandant.getPk());
    }
    formBuilder.addProperty(properties.getNameProperty()).withKey("name");
    if (persistenterSystemMandant) {
      formBuilder.addProperty(properties.getArtProperty()).readonly().withKey("art");
    } else {
      LambdaEnumProperty<MandantArt> artMitLeererAuswahlProperty = properties.getArtMitLeererAuswahlProperty();
      artMitLeererAuswahlProperty.setValueFilter(MandantArt::isAnlegenMoeglich);
      formBuilder.addProperty(artMitLeererAuswahlProperty).withKey("mitLeererAuswahl");
    }
    formBuilder.addProperty(properties.getStatusMitLeererAuswahlProperty()).withReadonly(persistenterSystemMandant).withKey("statusMitLeererAuswahl");
    addSystemGebietsebeneProperties(formBuilder, mandant, systemGebietsebeneAuswahl);

    formBuilder.addProperty(properties.getVerantworteteGebieteProperty());

    formBuilder.addProperty(properties.getBeschreibungProperty()).withKey("beschreibung");
  }

  public static void addSystemGebietsebeneProperties(FormBuilder formBuilder, Mandant mandant, SystemGebietsebeneAuswahl systemGebietsebeneAuswahl) {
    if (mandant != null) {
      LambdaEnumProperty<SystemGebietsebene> systemGebietsebeneMitLeererAuswahlProperty = mandant.getProperties()
          .getSystemGebietsebeneMitLeererAuswahlProperty();
      Set<SystemGebietsebene> availableSystemGebietsebenen = systemGebietsebeneAuswahl.getAvailableSystemGebietsebenen();
      systemGebietsebeneMitLeererAuswahlProperty.setValueFilter(availableSystemGebietsebenen::contains);
      formBuilder.addProperty(systemGebietsebeneMitLeererAuswahlProperty).withReadonly(mandant.isPersistent() && !mandant.getArt().isCustomerMandant());
    }
  }

}
