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

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

import de.ivu.elect.business.wahlvorschlag.boundary.ListeEdit;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;
import de.ivu.elect.presentation.wahlvorschlag.ListeSearchView;

public abstract class AbstractListeZulassungAction extends AbstractListeAction implements WahlvorschlagZulassungspruefungAction<Liste> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ListeEdit listeEdit;

  protected AbstractListeZulassungAction() {
    super();
  }

  protected abstract WahlvorschlagStatus getWahlvorschlagStatus();

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

  @Override
  public boolean isDisabledInternal(@Nonnull Liste liste) {
    return isDisabledInternal(liste, getCurrentWahlZulassungspruefung());
  }

  @Override
  protected boolean isDisabledInternalOnRowDblselect(@Nonnull Liste liste) {
    return true;
  }

  @Override
  protected String doIt(Liste liste) {
    return doIt(liste, getWahlvorschlagStatus(), "");
  }

  protected String doIt(Liste liste, WahlvorschlagStatus wahlvorschlagStatus, String wahlvorschlagStatusBemerkung) {
    try {
      listeEdit.setStatus(liste, wahlvorschlagStatus, wahlvorschlagStatusBemerkung);

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

    return ListeSearchView.VIEW_ID;
  }

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

  @Override
  public String doIfActionNotPossible(Liste liste) {
    messages.addErrorMessage("liste.search.action.error.message.status.hat.sich.geaendert", liste.getKennwort());

    return ListeSearchView.VIEW_ID;
  }

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

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