package de.ivu.elect.presentation.wahl;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahl.boundary.WahlterminExtendedDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminFactory;
import de.ivu.elect.business.wahl.boundary.WahlterminStichwahlCreate;
import de.ivu.elect.business.wahl.control.WahlterminNummerRelevant;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminMeta;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.AbstractElectCreateView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahl.action.WahlterminZurBearbeitungAuswaehlenAction;
import de.ivu.elect.presentation.wahl.form.WahlterminViewFormBuilder;


import static java.util.Objects.nonNull;

@OnlineHilfeId("435")
@RequestScoped
@Named(WahlterminStichwahlCreateView.COMPONENT_NAME)
@View(viewId = WahlterminStichwahlCreateView.VIEW_ID, useCase = UseCasePermission.WAHLTERMIN_STICHWAHL_CREATE)
public class WahlterminStichwahlCreateView extends AbstractElectCreateView<Wahltermin> {

  public static final String COMPONENT_NAME = "wahlterminStichwahlCreateView";

  public static final String VIEW_ID = "/wahl/wahltermin-stichwahl-create.xhtml";

  private static final long serialVersionUID = 1L;

  private static final String PARENT_VIEW_ID = WahlterminSearchView.VIEW_ID;

  @Inject
  private transient WahlterminStichwahlCreate wahlterminStichwahlCreate;

  @Inject
  private transient WahlterminFactory wahlterminFactory;

  @Inject
  private transient WahlterminMeta wahlterminMeta;

  @Inject
  private transient WahlterminZurBearbeitungAuswaehlenAction wahlterminZurBearbeitungAuswaehlenAction;

  @Inject
  private transient WahlterminViewFormBuilder viewFormBuilder;

  @Inject
  private transient WahlterminExtendedDAO wahlterminExtendedDAO;

  @Inject
  private transient WahlterminNummerRelevant wahlterminNummerRelevant;

  private transient Wahltermin entity;

  public WahlterminStichwahlCreateView() {
    super();
  }

  protected String getViewId() {
    return VIEW_ID;
  }

  protected String getParentViewId() {
    return PARENT_VIEW_ID;
  }

  @PostConstruct
  public void init() {
    setEntity(wahlterminFactory.create());

    // ELECT-3119
    if (isWahlterminSelected()) {
      Wahltermin stichwahltermin = getEntity();
      Wahltermin wahlterminUrspruenglich = getSelectedWahltermin();

      stichwahltermin.setStichwahlWahlterminUrspruenglich(wahlterminUrspruenglich);
      stichwahltermin.setBuergerZugelassen(wahlterminUrspruenglich.getBuergerZugelassen());

      if (nonNull(wahlterminUrspruenglich.getStichwahlWahldatum())) {
        stichwahltermin.setWahldatum(wahlterminUrspruenglich.getStichwahlWahldatum());
      }
    }
  }

  @Override
  public Wahltermin getEntity() {
    return entity;
  }

  protected void setEntity(Wahltermin entity) {
    if (wahlterminNummerRelevant.isNummerRelevant()) {
      entity.setNummer(null); // Eingabe erzwingen
    }
    entity.setMandant(getMandant());

    this.entity = entity;
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, Wahltermin wahltermin) {
    viewFormBuilder.addProperties(formBuilder, wahltermin);
  }

  @Override
  public boolean isBtnSaveRendered() {
    return hasPermission(UseCasePermission.WAHLTERMIN_STICHWAHL_CREATE);
  }

  @Override
  public String getBtnSaveLabel() {
    return getMessage("entity.edit.action.save");
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.WAHLTERMIN_STICHWAHL_CREATE)
  public String save() {
    Wahltermin stichwahltermin = getEntity();
    Wahltermin neuerWahltermin = wahlterminExtendedDAO.refresh(createStichwahl(stichwahltermin));
    addMessageSaveSuccess(neuerWahltermin);
    return resolveGoBack(neuerWahltermin);
  }

  protected String resolveGoBack(Wahltermin stichwahltermin) {
    if (wahlterminZurBearbeitungAuswaehlenAction.isActionPossible(stichwahltermin)) {
      goBack(getParentViewId()); // View vom Stack nehmen
      return wahlterminZurBearbeitungAuswaehlenAction.action(stichwahltermin);
    }

    return goBack(getParentViewId());
  }

  protected Wahltermin createStichwahl(Wahltermin stichwahltermin) {
    return wahlterminStichwahlCreate.createWahlterminFuerStichwahl(stichwahltermin);
  }

  protected void addMessageSaveSuccess(Wahltermin entity) {
    addInfoMessage("entity.create.action.save.success.message", wahlterminMeta.getEinzahlMessage());
  }

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

  @Override
  @Redirect
  public String reset() {
    init();

    return getViewId();
  }

  @Override
  public boolean isBtnCancelRendered() {
    return true;
  }

  @Override
  @Redirect
  public String cancel() {
    return goBack(getParentViewId());
  }
}
