
package de.ivu.elect.presentation.lokalisierung;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;
import javax.inject.Named;

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

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.lokalisierung.control.LokalisierungSchluesselCollectorLastRequestStore;
import de.ivu.elect.business.lokalisierung.entity.Lokalisierung;
import de.ivu.elect.business.lokalisierung.entity.LokalisierungLocale;
import de.ivu.elect.business.lokalisierung.entity.LokalisierungModul;
import de.ivu.elect.business.lokalisierung.entity.LokalisierungProperties;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@ViewAccessScoped
@OnlineHilfeId(value = "265", mehrfachVergebenOk = true)
@Named(AbstractLokalisierungSearchView.COMPONENT_NAME)
@View(viewId = AbstractLokalisierungSearchView.VIEW_ID, useCase = UseCasePermission.LOKALISIERUNG_SEARCH)
public class LokalisierungSearchView extends AbstractLokalisierungSearchView {

  private static final long serialVersionUID = 1L;

  public static final int DEFAULT_LOKALISIERUNG_PAGE_SIZE = 200;

  private static final int MAX_BULK_EDIT_SIZE = DEFAULT_LOKALISIERUNG_PAGE_SIZE;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @View
  @Inject
  private transient LokalisierungBulkEditView lokalisierungBulkEditView;

  @Inject
  private transient LokalisierungSchluesselCollectorLastRequestStore lokalisierungSchluesselCollectorLastRequestStore;

  public LokalisierungSearchView() {
    super();
  }

  @Redirect
  public String lokalisiereSeite() {
    getSearchParameters().setLokalisierungSchluesselCollector(lokalisierungSchluesselCollectorLastRequestStore.getLokalisierungSchluesselCollector());

    presetSearchParameters();

    return VIEW_ID;
  }

  public boolean isBulkEditDisabled() {
    return isEmptySearchResultDisplayed() || getSearchResult().size() > MAX_BULK_EDIT_SIZE;
  }

  public boolean isBulkEditRendered() {
    return hasPermission(UseCasePermission.LOKALISIERUNG_EDIT);
  }

  @Redirect
  public String bulkEdit() {
    if (isBulkEditRendered() && !isBulkEditDisabled()) {
      return lokalisierungBulkEditView.edit(getSearchResult());
    }

    return getViewId();
  }

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

  @Override
  public void presetSearchParameters() {
    resetSearchParametersModel();

    getSearchParameters().getLokalisierung().setLocale(LokalisierungLocale.byLocale(getUserLocale().getLocale()));
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    String wildcardTooltip = getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);

    Lokalisierung lokalisierung = getSearchParameters().getLokalisierung();
    LokalisierungProperties lokalisierungProperties = lokalisierung.getProperties();

    LambdaEnumProperty<LokalisierungLocale> localeProperty = lokalisierungProperties.getLocaleMitLeererAuswahlProperty();

    List<LokalisierungLocale> alleUnterstuetztenSprachen = currentCustomer.getAlleUnterstuetztenSprachen();

    if (!alleUnterstuetztenSprachen.isEmpty()) {
      Set<LokalisierungLocale> alleUnterstuetztenSprachenSet = EnumSet.copyOf(alleUnterstuetztenSprachen);
      localeProperty.setValueFilter(alleUnterstuetztenSprachenSet::contains);
    }

    formBuilder.addProperty(localeProperty).optional();

    LambdaEnumProperty<LokalisierungModul> modulProperty = lokalisierungProperties.getModulMitLeererAuswahlProperty();

    List<LokalisierungModul> modulPropertyValues = new ArrayList<>(modulProperty.getValues());
    modulPropertyValues.sort((one, another) -> one.name().compareTo(another.name()));

    formBuilder.addProperty(modulProperty).setValues(modulPropertyValues).optional();

    if (getSearchParameters().isSchluesselSetVorhanden()) {
      formBuilder.addProperty(new ReadOnlyStringProperty(getMessage("lokalisierung.suche.schluessel.aus.seite"), "<" + getSearchParameters().getViewId() + ">"));
    } else {
      formBuilder.addProperty(lokalisierungProperties.getSchluesselProperty()).withTooltip(wildcardTooltip).withRequired(false);
    }

    formBuilder.addProperty(getSearchParameters().getLokalisierungWertNichtVorhandenProperty());
    formBuilder.addProperty(lokalisierungProperties.getWertGeaendertProperty()).withLabel(getMessage("lokalisierung.verwendeter.wert"));
    formBuilder.addProperty(getSearchParameters().getLokalisierungSchluesselMitPunktAmEndeAnzeigenProperty());
  }
}
