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

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.jee.entity.ExtendedDAO;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.protokollierung.ProtokollEintragSearchView;

public class StimmeingabePlausiKonfigurationProtokollAnzeigenAction
    extends
      AbstractStimmeingabePlausiKonfigurationAction {

  private static final Logger LOGGER = LoggerFactory
      .getLogger(StimmeingabePlausiKonfigurationProtokollAnzeigenAction.class);

  @Inject
  private transient ExtendedDAO extendedDao;

  @View
  @Inject
  private transient ProtokollEintragSearchView protokollEintragSearchView;

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

  @Override
  protected String doIt(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration) {
    return protokollEintragSearchView.showWithEntity(stimmeingabePlausiKonfiguration);
  }

  @Override
  public String getLabelKey() {
    return "entity.edit.action.protokoll";
  }

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

  @Override
  public boolean isDisabled(StimmeingabePlausiKonfiguration proxy) {
    boolean disabledAnyway = isNull(proxy) || !tryCastToEntity(proxy).isAenderungenProtokollieren();

    // ELECT-5246
    return disabledAnyway || super.isDisabled(proxy);
  }

  @Override
  protected boolean isDisabledInternal(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration) {
    return isNull(stimmeingabePlausiKonfiguration) || !stimmeingabePlausiKonfiguration.isAenderungenProtokollieren()
        || !stimmeingabePlausiKonfiguration.isPersistent();
  }

  @Override
  protected StimmeingabePlausiKonfiguration attach(StimmeingabePlausiKonfiguration entity) {
    if (nonNull(entity) && entity.isPersistent()) {
      try {
        // ELECT-5056
        return extendedDao.getEntityManager().find(entity.getClass(), entity.getId());
      } catch (Exception ex) {
        LOGGER.warn("FAILED to attach entity [id = " + entity.getId() + ", class = " + entity.getClass() + "]", ex);
      }
    }

    return entity;
  }
}
