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

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

import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungBulkEdit;
import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungCalculator;
import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungExtendedDAO;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungConstants;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungStatus;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractAuszahlungEntschaedigungMarkAsEntschaedigungStatusAction extends AbstractAuszahlungAction implements EntschaedigungMarkAsEntschaedigungStatusAction {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient EntschaedigungExtendedDAO entschaedigungExtendedDAO;

  @Inject
  protected transient EntschaedigungBulkEdit entschaedigungBulkEdit;

  @Inject
  protected transient EntschaedigungCalculator entschaedigungCalculator;

  protected AbstractAuszahlungEntschaedigungMarkAsEntschaedigungStatusAction() {
    super();
  }

  @Override
  public UseCasePermission getRequiredPermission() {
    return UseCasePermission.ENTSCHAEDIGUNG_EDIT;
  }

  @Override
  public AbstractGebietSecurity getGebietSecurity() {
    return KEINE_GEBIET_SECURITY;
  }

  @Override
  public boolean isDisabledInternal(@Nonnull Auszahlung auszahlung) {
    return super.isDisabledInternal(auszahlung) || isDisabledByEntschaedigungenRelevant(auszahlung);
  }

  protected boolean isDisabledByEntschaedigungenRelevant(Auszahlung auszahlung) {
    return auszahlung.createEntschaedigungenAggregator(entschaedigungExtendedDAO).isEmpty();
  }

  public abstract EntschaedigungStatus getZuSetzenderEntschaedigungStatus();

  @Override
  protected String doIt(Auszahlung auszahlung) {
    if (isActionConfirmationRequired(auszahlung)) {
      auszahlungConversationSelect.setEntity(auszahlung);

      return null; // Return to current page and display the dialog!
    }

    return doActionConfirmed(auszahlung);
  }

  @Override
  public String getDialogName() {
    return getActionConfirmationDialogName();
  }

  @Override
  public String getDialogHeader() {
    return getMessage("entschaedigung.edit.action.mark.as." + getZuSetzenderEntschaedigungStatus().name() + ".confirm.header");
  }

  @Override
  public String getDialogMessage() {
    return getMessage("auszahlung.entschaedigung.edit.action.mark.as." + getZuSetzenderEntschaedigungStatus().name() + ".confirm.message");
  }

  @Override
  public boolean isDialogModelRendered() {
    return getDialogModel() != null && getDialogModel().isAnyPropertyAdded();
  }

  @Override
  public AdvancedDynaFormModel getDialogModel() {
    FormBuilder formBuilder = new FormBuilder();
    addDialogModelProperties(formBuilder);

    return formBuilder.createModel();
  }

  protected void addDialogModelProperties(FormBuilder formBuilder) {
    // To be overridden...
  }

  public boolean isActionConfirmationRequired(Auszahlung auszahlung) {
    return auszahlung != null;
  }

  protected abstract String getActionConfirmationDialogName();

  @Override // NOTE, dass diese Methode in /elect-common-war/src/main/webapp/entschaedigung/auszahlung-search.xhtml aufgerufen wird!
  public String doActionConfirmed() {
    String outcome = doActionConfirmed(auszahlungConversationSelect.getEntity());

    auszahlungConversationSelect.clearEntity();

    return outcome;
  }

  public String doActionConfirmed(Auszahlung auszahlung) {
    if (isActionPossible(auszahlung)) {
      markEntschaedigungenRelevantAsEntschaedigungStatus(auszahlung);
    }

    return FacesContextUtil.getCurrentViewId();
  }

  protected abstract void markEntschaedigungenRelevantAsEntschaedigungStatus(Auszahlung auszahlung);

  @Override
  public String getLocalizedLabel() {
    return getMessage(getLabelKey(), getMessage(EntschaedigungConstants.MESSAGE_KEY_ENTITY_MEHRZAHL));
  }

  @Override
  public String getLabelKey() {
    return "entschaedigung.edit.action.mark.as." + getZuSetzenderEntschaedigungStatus().name();
  }

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