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

import javax.annotation.Nonnull;
import javax.inject.Inject;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.veranstaltung.boundary.TeilnahmeEdit;
import de.ivu.elect.business.veranstaltung.boundary.TeilnahmeExtendedDAO;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractTeilnahmeStatusAction extends AbstractTeilnahmeAction {

  @Inject
  private TeilnahmeEdit teilnahmeEdit;

  @Inject
  private TeilnahmeExtendedDAO teilnahmeExtendedDAO;

  @Override
  public boolean isDisabledInternal(@Nonnull Teilnahme entity) {
    if (super.isDisabledInternal(entity)) {
      return true;
    }

    return getStatus().equals(entity.getTeilnehmerStatus());
  }

  @Override
  protected UseCasePermission getRequiredPermission() {
    return UseCasePermission.TEILNAHME_EDIT;
  }

  @Override
  protected boolean isFireChangeEvent() {
    return true;
  }

  protected abstract TeilnehmerStatus getStatus();

  @Override
  protected String doIt(Teilnahme entity) {
    Teilnahme teilnahme = teilnahmeExtendedDAO.attach(entity);
    teilnahme.setTeilnehmerStatus(getStatus());
    teilnahmeEdit.save(teilnahme);

    return null;
  }

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

  @Override
  public String getIcon() {
    return getStatus().getIcon(appIcons);
  }

  @Override
  protected String getLocalizedLabel() {
    return getMessage(getLabelKey(), getMessage(getStatus()));
  }

  @Override
  public String getLabelKey() {
    return "teilnahme.search.status.setzen.action";
  }
}
