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

import java.util.Collection;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;

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

import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.person.entity.PersonendatenArt;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.veranstaltung.boundary.VeranstaltungConversationSelect;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.presentation.menu.AbstractMenuItemEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;
import de.ivu.elect.presentation.veranstaltung.TeilnehmerEinladen;

public abstract class AbstractTeilnehmerEinladenMenuItemEntry extends AbstractMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient VeranstaltungConversationSelect veranstaltungSelect;

  @Inject
  @ConversationGroup(TeilnehmerEinladen.class)
  private transient TeilnehmerEinladen teilnehmerEinladen;

  public AbstractTeilnehmerEinladenMenuItemEntry() {
    super();
  }

  @Override
  public boolean isRendered() {
    return hasUseCasePermission(UseCasePermission.TEILNAHME_CREATE) && hasUseCasePermission(getSearchPermisson());
  }

  @Override
  public boolean isDisabledInternal() {
    return !isGebietSelected() || !veranstaltungSelect.isSelected();
  }

  protected abstract UseCasePermission getSearchPermisson();

  @Override
  public String getTargetViewId() {
    return null; // processAction
  }

  @Override
  public void processAction(ActionEvent event) {
    teilnehmerEinladen.setTeilnehmerEinladenModus(true);

    FacesContextUtil.redirectToView(getViewId());
  }

  protected abstract String getViewId();

  @Override
  protected String getLabel() {
    return getMessage(getLabelKey(), getMeta().getMehrzahlMessage());
  }

  @Override
  public String getLabelKey() {
    return "teilnehmer.einladen.action.add.personendaten";
  }

  protected abstract Meta getMeta();

  public abstract Collection<PersonendatenArt> getPersonendatenArten();

  @Override
  public String getIcon() {
    return getIcons().getIconPerson();
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return getBearbeitenGebietSecurity();
  }

  @Override
  protected boolean isRechtAufGebietVorhanden() {
    if (veranstaltungSelect.isSelected()) {
      return getGebietSecurity().isRechtVorhanden((EntityMitGebiet) veranstaltungSelect.getEntity());
    }

    return false;
  }
}
