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

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

import de.ivu.elect.business.kandidatur.boundary.ErsatzkandidaturEdit;
import de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.presentation.kandidatur.ListenkandidaturSearchView;

public abstract class AbstractErsatzkandidaturZulassungAction extends AbstractErsatzkandidaturAction implements KandidaturZulassungspruefungAction<Ersatzkandidatur> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErsatzkandidaturEdit ersatzkandidaturEdit;

  protected AbstractErsatzkandidaturZulassungAction() {
    super();
  }

  @Override
  public boolean isDisabledInternal(Ersatzkandidatur ersatzkandidatur) {
    return isDisabledInternal(ersatzkandidatur, getCurrentWahlZulassungspruefung());
  }

  @Override
  protected boolean isDisabledInternalOnRowDblselect(@Nonnull Kandidatur kandidatur) {
    return true;
  }

  protected abstract KandidaturStatus getKandidaturStatus();

  @Override
  protected String doIt(Ersatzkandidatur ersatzkandidatur) {
    try {
      ersatzkandidaturEdit.setStatus(ersatzkandidatur, getKandidaturStatus());

      doItPostActions(ersatzkandidatur);
    } catch (ElectCommonException ex) {
      messages.addErrorMessage(ex.getMessageKey(), ex.getObjects());
    }

    return ListenkandidaturSearchView.VIEW_ID;
  }

  // Cf. AbstractListeZulassungAction#doItPostActions, AbstractDirektkandidaturZulassungAction#doItPostActions, AbstractListenkandidaturZulassungAction#doItPostActions!!!
  private void doItPostActions(Ersatzkandidatur template) {
    //    Kandidatur kandidatur = attach(template); // ELECT-12444, LazyInitializationException -> "Aktualisierung des Views" allerdings gar nicht nötig?!
    //    kandidatur.setKandidaturStatus(getKandidaturStatus());
  }

  @Override
  public String doIfActionNotPossible(Kandidatur kandidatur) {
    Ersatzkandidatur ersatzkandidatur = asErsatzkandidatur(kandidatur);

    if (ersatzkandidatur != null) {
      messages.addErrorMessage("kandidatur.search.action.error.message.status.hat.sich.geaendert", ersatzkandidatur.getFamilienname());
    }

    return ListenkandidaturSearchView.VIEW_ID;
  }

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

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