
package de.ivu.elect.presentation.menu;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.presentation.menu.AbstractBaseMenuItemEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;
import de.ivu.elect.presentation.security.BearbeitenGebietSecurity;
import de.ivu.elect.presentation.security.EinsehenGebietSecurity;
import de.ivu.elect.presentation.security.GebietSecurity;

public abstract class AbstractMenuItemEntry extends AbstractBaseMenuItemEntry {

  private static final long serialVersionUID = 1L;

  protected static final AbstractGebietSecurity KEINE_GEBIET_SECURITY = AbstractGebietSecurity.KEINE_GEBIET_SECURITY;

  private static final int MAX_LABEL_LENGTH = 40; // willkürlich

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient GebietSecurity gebietSecurity;

  public AbstractMenuItemEntry() {
    super();
  }

  @Override
  public boolean isDisabled() {
    if (isDisabledInternal()) {
      return true;
    }

    if (!isRechtAufGebietVorhanden()) {
      return true;
    }

    return false;
  }

  protected abstract boolean isDisabledInternal();

  protected boolean isLoggedIn() {
    return getPrincipal().isLoggedIn();
  }

  protected boolean hasUseCasePermission(UseCasePermission permission) {
    return getPrincipal().hasUseCasePermission(permission);
  }

  protected ElectCommonPrincipal getPrincipal() {
    return principal;
  }

  protected boolean isRechtAufGebietVorhanden() {
    if (KEINE_GEBIET_SECURITY == getGebietSecurity()) {
      return true;
    }

    return getGebietSecurity().isRechtVorhanden(getGebietFuerSecurity());
  }

  protected Gebiet getGebietFuerSecurity() {
    return getSelectedGebiet();
  }

  protected boolean isGebietSelected() {
    return gebietSessionSelect.isSelected();
  }

  protected Gebiet getSelectedGebiet() {
    return gebietSessionSelect.getEntity();
  }

  protected EinsehenGebietSecurity getEinsehenGebietSecurity() {
    return gebietSecurity.getEinsehenGebietSecurity();
  }

  protected BearbeitenGebietSecurity getBearbeitenGebietSecurity() {
    return gebietSecurity.getBearbeitenGebietSecurity();
  }

  /**
   * ELECT-3505 - Wahl(art)- und gebietsabhängiges Rechtekonzept umsetzen
   */
  protected abstract AbstractGebietSecurity getGebietSecurity();

  protected Mandant getMandant() {
    return principal.getMandant();
  }

  public boolean isPossible() {
    return isRendered() && !isDisabled();
  }

  public void buttonAction() {
    if (isPossible()) {
      if (getTargetViewId() == KEIN_TARGET) {
        FacesContextUtil.redirectToView(doAction());
      } else {
        FacesContextUtil.redirectToView(getTargetViewId());
      }
    } else {
      FacesContextUtil.redirectToView(FacesContextUtil.getCurrentViewId());
    }
  }

  public boolean isButtonAjax() {
    return isAjax();
  }

  protected String cutLabelLength(String label) {
    if (StringUtils.isNotBlank(label) && label.length() > MAX_LABEL_LENGTH) {
      return label.substring(0, MAX_LABEL_LENGTH) + getMessage("menu.item.elipsis");
    }

    return label;
  }
}
