
package de.ivu.elect.presentation.entschaedigung;

import java.math.BigDecimal;

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

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

import de.ivu.elect.business.entschaedigung.boundary.EntschaedigungsartCreateParameters;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartConstants;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTemplate;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.entschaedigung.form.EntschaedigungsartViewFormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId("588")
@Named(AbstractEntschaedigungsartCreateNoScopeView.COMPONENT_NAME)
public class EntschaedigungsartCreateView extends AbstractEntschaedigungsartCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  @ConversationGroup(EntschaedigungsartCreateParameters.class)
  private transient EntschaedigungsartCreateParameters entschaedigungsartCreateParameters;

  @Inject
  private transient EntschaedigungsartViewFormBuilder entschaedigungsartViewFormBuilder;

  public EntschaedigungsartCreateView() {
    super();
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();

    Entschaedigungsart entschaedigungsart = getEntity();
    entschaedigungsart.setWaehrungAlsIsoCode(EntschaedigungsartTemplate.DEFAULT_WAEHRUNG.getCurrencyCode());

    if (isWahlSelected()) {
      Wahl wahl = getSelectedWahl();

      entschaedigungsart.setWahl(wahl);
      entschaedigungsart.setWahltermin(wahl.getWahltermin());
    }

    if (isWahlterminSelected()) {
      entschaedigungsart.setWahltermin(getSelectedWahltermin());
    }

    entschaedigungsart.setAnzahlMinimal(0L); // ELECT-9087

    initCreateParameters(entschaedigungsart);
  }

  public String getPageTitle() {
    return getMessage("entity.create.page.title", getMessage(getEntityMsgKey()));
  }

  public String getPageHeader() {
    return getMessage("entity.create.page.header", getMessage(getEntityMsgKey()));
  }

  private String getEntityMsgKey() {
    if (entschaedigungsartCreateParameters.hasPersonendatenArt()) {
      String msgKey = "Entschaedigungsart." + entschaedigungsartCreateParameters.getPersonendatenArt().getTechnicalName();

      if (getMessages().isMessageKeyVorhanden(msgKey)) {
        return msgKey;
      }
    }

    return EntschaedigungsartConstants.MESSAGE_KEY_ENTITY_EINZAHL;
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Entschaedigungsart entschaedigungsart) {
    entschaedigungsartViewFormBuilder.addProperties(formBuilder, entschaedigungsart, entschaedigungsartCreateParameters);
  }

  @Override
  protected void callSave(Entschaedigungsart entschaedigungsart) {
    initCreateParameters(entschaedigungsart);

    super.callSave(entschaedigungsart);

    resetCreateParameters();
  }

  @Override
  @Redirect
  public String cancel() {
    resetCreateParameters();

    return super.cancel();
  }

  private void initCreateParameters(Entschaedigungsart entschaedigungsart) {
    if (entschaedigungsartCreateParameters.hasPersonendatenArt()) {
      entschaedigungsart.setKriteriumPersonendatenArt(entschaedigungsartCreateParameters.getPersonendatenArt().getTechnicalName());
    }

    if (entschaedigungsartCreateParameters.hasBerechnungsart()) {
      entschaedigungsart.setBerechnungsart(entschaedigungsartCreateParameters.getBerechnungsart());
    }

    if (Boolean.FALSE.equals(entschaedigungsartCreateParameters.getEinzelbetragVariabel())) {
      BigDecimal einzelbetrag = entschaedigungsart.getEinzelbetragInitial();

      entschaedigungsart.setEinzelbetragMinimal(einzelbetrag);
      entschaedigungsart.setEinzelbetragMaximal(einzelbetrag);
    }

    if (Boolean.TRUE.equals(entschaedigungsartCreateParameters.getEinzelbetragNurGewaehrbar())) {
      entschaedigungsart.setAnzahlMinimal(0L);
      entschaedigungsart.setAnzahlMaximal(1L);
    }
  }

  private void resetCreateParameters() {
    entschaedigungsartCreateParameters.reset();
  }
}
