
package de.ivu.elect.presentation.search.menu;

import static org.apache.commons.lang3.StringUtils.isBlank;

import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.search.boundary.BenutzerSuchparameterSearch;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.presentation.ViewHavingSuchparameterSpeicherbar;
import de.ivu.elect.presentation.menu.AbstractMenuItemEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractBenutzerSuchparameterMenuItemEntry extends AbstractMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BenutzerSuchparameterSearch benutzerSuchparameterSearch;

  @Inject
  private transient WahlSessionSelector wahlSelect;

  @Inject
  private transient WahlterminSessionSelect wahlterminSessionSelect;

  @Inject
  private transient CurrentViewViewHavingSuchparameterSpeicherbar currentViewViewHavingSuchparameterSpeicherbar;

  public AbstractBenutzerSuchparameterMenuItemEntry() {
    super();
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return AbstractMenuItemEntry.KEINE_GEBIET_SECURITY;
  }

  @Override
  protected List<String> getAdditionalTopicViewIds() {
    return Collections.singletonList("");
  }

  @Nullable
  protected ViewHavingSuchparameterSpeicherbar getCurrentView() {
    return currentViewViewHavingSuchparameterSpeicherbar.getCurrentViewInstance();
  }

  protected int getBenutzerSuchparameterCount() {
    if (!isWahlSelected() && !isWahlterminSelected()) {
      return Integer.MAX_VALUE;
    }

    String viewId = FacesContextUtil.getCurrentViewId();

    if (isBlank(viewId)) {
      return Integer.MAX_VALUE;
    }

    return benutzerSuchparameterSearch.getSearchResult(getSelectedWahltermin(), getSelectedWahl(), getSelectedBenutzerKennung(), viewId).size();
  }

  private boolean isWahlSelected() {
    return wahlSelect.isSelected();
  }

  private Wahl getSelectedWahl() {
    return wahlSelect.getEntity();
  }

  private boolean isWahlterminSelected() {
    return wahlterminSessionSelect.isSelected();
  }

  private Wahltermin getSelectedWahltermin() {
    return wahlterminSessionSelect.getEntity();
  }

  private String getSelectedBenutzerKennung() {
    return getPrincipal().getBenutzerKennung();
  }
}
