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

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

import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.boundary.DirektkandidatEdit;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.presentation.kandidatur.DirektkandidaturSearchView;

public abstract class AbstractDirektkandidaturZulassungAction extends AbstractDirektkandidaturAction implements KandidaturZulassungspruefungAction<Direktkandidatur> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient DirektkandidatEdit direktkandidatEdit;

  protected AbstractDirektkandidaturZulassungAction() {
    super();
  }

  @Override
  protected boolean isDisabledInternal(Direktkandidatur direktkandidatur) {
    return isDisabledInternal(direktkandidatur, getCurrentWahlZulassungspruefung());
  }

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

  protected abstract WahlvorschlagStatus getWahlvorschlagStatus();

  @Override
  protected String doIt(Direktkandidatur direktkandidatur) {
    Direktkandidat direktkandidat = asDirektkandidat(direktkandidatur);

    if (direktkandidat != null) {
      return doIt(direktkandidat, getWahlvorschlagStatus(), "");
    }

    return DirektkandidaturSearchView.VIEW_ID;
  }

  protected String doIt(Direktkandidat direktkandidat, WahlvorschlagStatus wahlvorschlagStatus, String wahlvorschlagStatusBemerkung) {
    try {
      direktkandidatEdit.setStatus(direktkandidat, wahlvorschlagStatus, wahlvorschlagStatusBemerkung);

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

    return DirektkandidaturSearchView.VIEW_ID;
  }

  // Cf. AbstractListeZulassungAction#doItPostActions, AbstractListenkandidaturZulassungAction#doItPostActions, AbstractErsatzkandidaturZulassungAction#doItPostActions
  private void doItPostActions(Direktkandidat template, WahlvorschlagStatus wahlvorschlagStatus) {
    //    Direktkandidat direktkandidat = attach(template); // ELECT-12444, LazyInitializationException -> "Aktualisierung des Views" allerdings gar nicht nötig?!
    //    direktkandidat.setWahlvorschlagStatus(wahlvorschlagStatus);
  }

  @Override
  public String doIfActionNotPossible(Kandidatur kandidatur) {
    Direktkandidat direktkandidat = asDirektkandidat(kandidatur);

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

    return DirektkandidaturSearchView.VIEW_ID;
  }

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

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