
package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
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.BenutzerSearchParameters;
import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerProperties;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleConstants;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.system.boundary.SystemStatusStore;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectManyProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;
import de.ivu.elect.presentation.LambdaEntitySelectManyProperty;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;
import org.apache.commons.lang3.StringUtils;

@OnlineHilfeId("117")
@Named(AbstractBenutzerSearchView.COMPONENT_NAME)
public class BenutzerSearchView extends AbstractBenutzerSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient SystemStatusStore systemStatusStore;

  @Inject
  private transient RolleExtendedDAO rolleExtendedDAO;

  public BenutzerSearchView() {
    super();
  }

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

  @Override
  protected void presetSearchParameters() {
    // nichts zu tun
  }

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

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

  @Override
  public void addProperties(FormBuilder formBuilder) {
    BenutzerProperties benutzerProperties = searchParameters.getBenutzerProperties();

    String wildcardTooltip = getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);

    formBuilder.addProperty(benutzerProperties.getBenutzerkennungProperty()).withTooltip(wildcardTooltip).optional();
    formBuilder.addProperty(benutzerProperties.getFamiliennameProperty()).withTooltip(wildcardTooltip);
    formBuilder.addProperty(benutzerProperties.getVornameProperty()).withTooltip(wildcardTooltip);

    formBuilder.addProperty(new LambdaEntitySelectManyProperty<>(findAlleRollenInDbOrderByName(),
        AbstractSelectManyProperty.CHECKBOX_MENU, rollen -> searchParameters.setRollen(rollen),
        () -> searchParameters.getRollen(), rolle -> rolle.getName(), RolleConstants.MESSAGE_KEY_ENTITY_EINZAHL, false));

    formBuilder.addProperty(benutzerProperties.getGesperrtProperty()).withLabel(getMessage("benutzer.search.nur.gesperrte.benutzer"));
  }

  private List<Rolle> findAlleRollenInDbOrderByName() {
    return rolleExtendedDAO.findByAll(getMandant()).stream() //
        .sorted(Comparator.comparing(rolle -> StringUtils.upperCase(rolle.getName()))) //
        .collect(Collectors.toList());
  }

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