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

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

import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturConversationSelect;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturEdit;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.kandidatur.ListenkandidaturSearchView;

public abstract class AbstractListenkandidaturZulassungAction extends AbstractListenkandidaturAction implements KandidaturZulassungspruefungAction<Listenkandidatur> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient ErgebnisRelevanteAenderungListener ergebnisRelevanteAenderungListener;

  @Inject
  protected transient ListenkandidaturEdit listenkandidaturEdit;

  @Inject
  protected transient ListenkandidaturConversationSelect listenkandidaturConversationSelect;

  @View
  @Inject
  protected transient ListenkandidaturSearchView listenkandidaturSearchView;

  protected AbstractListenkandidaturZulassungAction() {
    super();
  }

  @Override
  protected boolean isDisabledInternal(Listenkandidatur listenkandidatur) {
    return isDisabledInternal(listenkandidatur, getCurrentWahlZulassungspruefung());
  }

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

  protected abstract KandidaturStatus getKandidaturStatus();

  public String getKandidaturStatusBemerkung() {
    return listenkandidaturSearchView.getKandidaturStatusBemerkung();
  }

  public void setKandidaturStatusBemerkung(String kandidaturStatusBemerkung) {
    listenkandidaturSearchView.setKandidaturStatusBemerkung(kandidaturStatusBemerkung);
  }

  @Override
  protected String doIt(@Nonnull Listenkandidatur listenkandidatur) {
    return doIt(listenkandidatur, getKandidaturStatus(), listenkandidatur.getBemerkung());
  }

  protected String doIt(Listenkandidatur listenkandidatur, KandidaturStatus kandidaturStatus, String kandidaturStatusBemerkung) {
    try {
      KandidaturStatus kandidaturStatusInitial = listenkandidatur.getKandidaturStatus();

      boolean gueltigeErgebniseingaengeErneutUebernehmen = kandidaturStatusInitial != null && kandidaturStatusInitial.isErneuteStimmenverteilungErforderlich()
          || kandidaturStatus.isErneuteStimmenverteilungErforderlich();

      listenkandidaturEdit.setStatus(listenkandidatur, kandidaturStatus, kandidaturStatusBemerkung);

      doItPostActions(listenkandidatur, kandidaturStatus, kandidaturStatusBemerkung, gueltigeErgebniseingaengeErneutUebernehmen);

      ergebnisRelevanteAenderungListener.aenderungAn(listenkandidatur, gueltigeErgebniseingaengeErneutUebernehmen);
    } catch (ElectCommonException ex) {
      messages.addErrorMessage(ex.getMessageKey(), ex.getObjects());
    }

    return ListenkandidaturSearchView.VIEW_ID;
  }

  // Cf. AbstractListeZulassungAction#doItPostActions, AbstractDirektkandidaturZulassungAction#doItPostActions, AbstractErsatzkandidaturZulassungAction#doItPostActions!!!
  private void doItPostActions(Listenkandidatur template, KandidaturStatus kandidaturStatus, String kandidaturStatusBemerkung, boolean gueltigeErgebniseingaengeErneutUebernehmen) {
    //    Kandidatur listenkandidatur = attach(template); // ELECT-12444, LazyInitializationException -> "Aktualisierung des Views" allerdings gar nicht nötig?!
    //    listenkandidatur.setKandidaturStatus(kandidaturStatus);
    //    listenkandidatur.setBemerkung(kandidaturStatusBemerkung);
  }

  @Override
  public String doIfActionNotPossible(Kandidatur kandidatur) {
    Listenkandidatur listenkandidatur = asListenkandidatur(kandidatur);

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

    return ListenkandidaturSearchView.VIEW_ID;
  }

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

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