
package de.ivu.elect.presentation.wertelisten;

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

import de.ivu.elect.business.personenpruefung.boundary.PersonenKonfliktWertenlistenAbgleichWertelisteneintragConversationSelect;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahl.boundary.WahlNichtAusgewaehltException;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;
import de.ivu.elect.business.wertelisten.entity.WertelistenArt;
import de.ivu.elect.jee.faces.AbstractEntityFacesValidator;
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.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wertelisten.form.WertelistenUniqueUKFacesValidator;
import de.ivu.elect.presentation.wertelisten.form.WertelistenViewFormBuilder;

@OnlineHilfeId("455")
@Named(AbstractWertelistenCreateView.COMPONENT_NAME)
public class WertelistenCreateView extends AbstractWertelistenCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  private WertelistenViewFormBuilder viewFormBuilder;

  @Inject
  private WertelistenUniqueUKFacesValidator facesValidator;

  @Inject
  private PersonenKonfliktWertenlistenAbgleichWertelisteneintragConversationSelect wertelisteneintragConversationSelect;

  // Zum Merken der WertelistenArt für das nächste Anlegen
  private WertelistenArt wertelistenArt = WertelistenArt.AKADEMISCHER_GRAD;

  public WertelistenCreateView() {
    super();
  }

  @PreConditionCheck
  public String preConditionCheck() {
    if (isWahlSelected()) {
      return null;
    }

    throw new WahlNichtAusgewaehltException();
  }

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

    Wertelisten entity = getEntity();

    if (wertelisteneintragConversationSelect.isSelected()) {
      Wertelisten wertelisteneintrag = wertelisteneintragConversationSelect.getWertelisteneintrag();
      entity.setWahl(getSelectedWahl());
      entity.setName(wertelisteneintrag.getName());
      entity.setWertelistenArt(wertelisteneintrag.getWertelistenArt());
    } else {
      entity.setWahl(getSelectedWahl());
      entity.setWertelistenArt(wertelistenArt);
    }
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.WERTELISTEN_CREATE)
  public String save() {
    Wertelisten wertelisten = getEntity();

    if (isValid(wertelisten)) {
      String viewId = super.save();
      init();

      // ELECT-2788: Der Konflikt ist nun evtl. gelöst.
      //

      wertelisteneintragConversationSelect.clearEntity();

      return viewId;
    }

    addErrorMessage(AbstractEntityFacesValidator.DETAIL_KEY, "", wertelisten.getName());

    return getViewId();
  }

  public boolean isBtnSaveAndWertelistenCreateRendered() {
    return hasPermission(UseCasePermission.WERTELISTEN_CREATE) && !wertelisteneintragConversationSelect.isSelected();
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.WERTELISTEN_CREATE)
  public String saveAndWertelistenCreate() {
    wertelistenArt = getEntity().getWertelistenArt(); // WertelistenArt für das nächste Anlegen merken

    save();

    return getViewId();
  }

  private boolean isValid(Wertelisten wertelisten) {
    return facesValidator.isValid(wertelisten);
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Wertelisten wertelisten) {
    viewFormBuilder.addProperties(formBuilder, wertelisten);
  }
}
