
package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ConversationGroup;

import de.ivu.elect.business.benutzerverwaltung.boundary.AngemeldeteBenutzer;
import de.ivu.elect.business.benutzerverwaltung.boundary.AngemeldeteBenutzerSearchParameters;
import de.ivu.elect.business.benutzerverwaltung.entity.AngemeldeterBenutzer;
import de.ivu.elect.business.mandant.boundary.MandantExtendedDAO;
import de.ivu.elect.business.mandant.control.MandantSupport;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.mandant.entity.MandantConstants;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.AbstractElectSearchView;
import de.ivu.elect.presentation.LambdaEntitySelectOneMenuProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.mandant.MandantNameFormatter;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@RequestScoped
@OnlineHilfeId("683")
@View(viewId = AngemeldeteBenutzerSearchView.VIEW_ID, useCase = UseCasePermission.ANGEMELDETE_BENUTZER_SEHEN)
@Named(AngemeldeteBenutzerSearchView.COMPONENT_NAME)
@UseCaseSecure(UseCasePermission.ANGEMELDETE_BENUTZER_SEHEN)
public class AngemeldeteBenutzerSearchView extends AbstractElectSearchView<AngemeldeterBenutzer> {

  private static final long serialVersionUID = 1L;

  public static final String VIEW_ID = "/benutzerverwaltung/angemeldete-benutzer-search.xhtml";

  public static final String COMPONENT_NAME = "angemeldeteBenutzerSearchView";

  @Inject
  @ConversationGroup(AngemeldeteBenutzerSearchParameters.class)
  private transient AngemeldeteBenutzerSearchParameters angemeldeteBenutzerSearchParameters;

  @Inject
  private transient AngemeldeteBenutzer angemeldeteBenutzer;

  @Inject
  private transient MandantExtendedDAO mandantExtendedDAO;

  @Inject
  private transient MandantNameFormatter mandantNameFormatter;

  @Inject
  private transient MandantSupport mandantSupport;

  public AngemeldeteBenutzerSearchView() {
    super();
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

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

  @Override
  public boolean isSupportsLazyLoading() {
    return false; // ELECT-8409
  }

  @Override
  public boolean isSearchParametersRendered() {
    return mandantSupport.isMandantenUnterstuetzt() && getMandant() != null && getMandant().getArt().isSystemMandant();
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    if (isSearchParametersRendered()) {
      formBuilder.addProperty(new LambdaEntitySelectOneMenuProperty<>(mandantExtendedDAO.findByAll().stream().sorted(Comparator.comparing(Mandant::getNummer)).collect(Collectors.toList()),
          getSearchParameters()::setMandant, getSearchParameters()::getMandant, mandantNameFormatter::formatiereName, MandantConstants.MESSAGE_KEY_ENTITY_EINZAHL, false, true));
    }
  }

  @Override
  protected void presetSearchParameters() {
    if (!getMandant().getArt().isSystemMandant()) {
      getSearchParameters().setMandant(getMandant());
    }
  }

  @Override
  public AngemeldeteBenutzerSearchParameters getSearchParameters() {
    if (!getMandant().getArt().isSystemMandant()) {
      angemeldeteBenutzerSearchParameters.setMandant(getMandant());
    }

    return angemeldeteBenutzerSearchParameters;
  }

  @Override
  protected List<AngemeldeterBenutzer> performSearch() {
    return angemeldeteBenutzer.getAngemeldeteBenutzer(x -> {
      Mandant mandant = getSearchParameters().getMandant();

      return mandant == null || mandant.getNummer().equals(x.getMandantNummer());
    });
  }
}
