
package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleSearchParameters;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.system.boundary.SystemStatusStore;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@OnlineHilfeId(value = "488", mehrfachVergebenOk = true)
@Named(AbstractRolleSearchView.COMPONENT_NAME)
public class RolleSearchView extends AbstractRolleSearchView {

  private static final long serialVersionUID = 1L;

  public RolleSearchView() {
    super();
  }

  @Inject
  private transient SystemStatusStore systemStatusStore;

  @Override
  protected AbstractGebietSecurityFilter<Rolle> getGebietSecurityFilter() {
    return KEIN_GEBIET_SECURITY_FILTER;
  }

  @Override
  public void presetSearchParameters() {
    // Do nothing.
  }

  @Override
  public RolleSearchParameters getSearchParameters() {
    RolleSearchParameters searchParameters = super.getSearchParameters();
    searchParameters.setMandant(getMandant());
    searchParameters.setVorhandeneRechte(bestimmeAlleMoeglichenRechteDesNutzers());
    return searchParameters;
  }

  @Nonnull
  private Set<UseCasePermission> bestimmeAlleMoeglichenRechteDesNutzers() {
    // ELECT-10491 und ELECT-12577
    return Arrays.stream(UseCasePermission.values()).filter(value -> getPrincipal().isUnfilteredHasUseCasePermissionHandleWithCare(value))
        .collect(Collectors.toSet());
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    formBuilder.addProperty(getSearchParameters().getNameProperty()).withRequired(false);
    formBuilder.addProperty(getSearchParameters().getBeschreibungProperty()).withRequired(false);
    formBuilder.addProperty(getSearchParameters().getRolleArtProperty()).withRequired(false);
  }

  public void preRenderView() {
    if (systemStatusStore.isProduktivmodusEnabled(getMandant())) {
      addWarningMessage("benutzerverwaltung.produktionsmodus.warnung");
    }
  }
}
