
package de.ivu.elect.presentation.entschaedigung;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.entschaedigung.boundary.AuszahlungConversationSelect;
import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungCalculator;
import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungInAuszahlungBulkCreate;
import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungInAuszahlungBulkCreateParameters;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId("540")
@ViewAccessScoped // Konditionelle Anzeige eines Hinweisdialoges!
@Named(EntschaedigungInAuszahlungBulkCreateView.COMPONENT_NAME)
@View(viewId = EntschaedigungInAuszahlungBulkCreateView.VIEW_ID, useCase = UseCasePermission.ENTSCHAEDIGUNG_CREATE)
public class EntschaedigungInAuszahlungBulkCreateView extends AbstractEntschaedigungCreateView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "entschaedigungInAuszahlungBulkCreateView";

  public static final String VIEW_ID = "/entschaedigung/entschaedigung-bulk-create.xhtml";

  public static final String PARENT_VIEW_ID = AbstractEntschaedigungSearchView.VIEW_ID;

  @Inject
  private transient AuszahlungConversationSelect auszahlungConversationSelect;

  @Inject
  private transient EntschaedigungCalculator entschaedigungCalculator;

  @Inject
  private transient EntschaedigungInAuszahlungBulkCreate entschaedigungInAuszahlungBulkCreate;

  @Inject
  @ConversationGroup(EntschaedigungInAuszahlungBulkCreateParameters.class)
  private transient EntschaedigungInAuszahlungBulkCreateParameters entschaedigungInAuszahlungBulkCreateParameters;

  private boolean dlgSaveConfirmedRequired;

  public EntschaedigungInAuszahlungBulkCreateView() {
    super();
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

  @Override
  protected String getParentViewId() {
    return PARENT_VIEW_ID;
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {
    if (isAuszahlungSelected()) {
      return null;
    }

    return cancel();
  }

  public String getPageHeader() {
    if (isAuszahlungSelected()) {
      return getMessage("entschaedigung.bulk.create.page.header", entityMeta.getMehrzahlMessage(), getSelectedAuszahlung().getBezeichnung());
    }

    return getMessage("entity.create.page.header", entityMeta.getMehrzahlMessage());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Entschaedigung entschaedigung) {
    String wildcardTooltip = getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);

    // Cf. EntschaedigungStatusView#addProperties!!!
    formBuilder.addProperty(entschaedigungInAuszahlungBulkCreateParameters.getEntschaedigungsartenProperty(getSupportedEntschaedigungsarten()));
    formBuilder.addProperty(entschaedigungInAuszahlungBulkCreateParameters.getEntschaedigungKriteriumEinsatzStatusProperty());
    formBuilder.addProperty(entschaedigungInAuszahlungBulkCreateParameters.getPersonendatenKontoverbindungFilterKriteriumProperty()).required();

    formBuilder.addProperty(entschaedigungInAuszahlungBulkCreateParameters.getFamiliennameProperty()).withTooltip(wildcardTooltip);
    formBuilder.addProperty(entschaedigungInAuszahlungBulkCreateParameters.getVornameProperty()).withTooltip(wildcardTooltip);
  }

  private List<Entschaedigungsart> getSupportedEntschaedigungsarten() {
    return new ArrayList<>(entschaedigungCalculator.getSupportedEntschaedigungsarten(getWahl(), getWahltermin()));
  }

  @Override
  public boolean isBtnResetRendered() {
    return false;
  }

  public boolean isDlgSaveConfirmedRequired() {
    return dlgSaveConfirmedRequired;
  }

  public void setDlgSaveConfirmedRequired(boolean dlgSaveConfirmedRequired) {
    this.dlgSaveConfirmedRequired = dlgSaveConfirmedRequired;
  }

  public boolean isBtnSaveConfirmedRendered() {
    return super.isBtnSaveRendered();
  }

  public String getBtnSaveConfirmedLabel() {
    return getMessage("entschaedigung.bulk.create.action.save");
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.ENTSCHAEDIGUNG_CREATE)
  public String saveConfirmed() {
    setDlgSaveConfirmedRequired(true);

    return getViewId();
  }

  @Override
  public boolean isBtnSaveRendered() {
    return false; // Cf. EntschaedigungInAuszahlungBulkCreateView#isBtnSaveConfirmedRendered
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.ENTSCHAEDIGUNG_CREATE)
  public String save() {
    setDlgSaveConfirmedRequired(false);

    entschaedigungInAuszahlungBulkCreateParameters.setWahl(getWahl());
    entschaedigungInAuszahlungBulkCreateParameters.setWahltermin(getWahltermin());
    entschaedigungInAuszahlungBulkCreateParameters.setAuszahlung(getSelectedAuszahlung());

    entschaedigungInAuszahlungBulkCreate.saveEntschaedigungenInAuszahlung(entschaedigungInAuszahlungBulkCreateParameters);

    addInfoMessage("entschaedigung.bulk.create.action.save.success.message", entityMeta.getMehrzahlMessage());

    return goBack(getParentViewId());
  }

  private Wahl getWahl() {
    if (isAuszahlungSelected()) {
      return getSelectedAuszahlung().getWahl();
    }

    return getSelectedWahl();
  }

  private Wahltermin getWahltermin() {
    if (isAuszahlungSelected()) {
      return getSelectedAuszahlung().getWahltermin();
    }

    return getSelectedWahltermin();
  }

  private boolean isAuszahlungSelected() {
    return auszahlungConversationSelect.isSelected();
  }

  private Auszahlung getSelectedAuszahlung() {
    return auszahlungConversationSelect.getEntity();
  }
}
