package de.ivu.elect.presentation.internet;

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

import de.ivu.elect.business.internet.boundary.InternetSeiteExtendedDAO;
import de.ivu.elect.business.internet.control.InternetSeiteCustomDataFactory;
import de.ivu.elect.business.internet.entity.InternetCustomDataCreateContext;
import de.ivu.elect.business.internet.entity.InternetSeite;
import de.ivu.elect.business.internet.entity.InternetSeiteCustomData;
import de.ivu.elect.business.internet.entity.InternetSeiteStatus;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.boundary.WahlNichtAusgewaehltException;
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.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.internet.form.InternetSeiteViewFormBuilder;

@RequestScoped
@Named(AbstractInternetSeiteCreateNoScopeView.COMPONENT_NAME)
@View(viewId = AbstractInternetSeiteCreateNoScopeView.VIEW_ID, useCase = UseCasePermission.INTERNET_SEITE_CREATE)
@OnlineHilfeId("745")
public class InternetSeiteCreateView extends AbstractInternetSeiteCreateView {

  protected static final String PARENT_VIEW_ID = AbstractInternetSeiteSearchView.VIEW_ID;

  @Inject
  private transient InternetSeiteViewFormBuilder viewFormBuilder;

  @Inject
  private transient InternetSeiteExtendedDAO internetSeiteExtendedDAO;

  @Inject
  private transient InternetSeiteCustomDataFactory internetSeiteCustomDataFactory;

  @View
  @Inject
  private transient InternetSeiteEditView internetSeiteEditView;

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

    throw new WahlNichtAusgewaehltException();
  }

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

    initEntity();
  }

  private void initEntity() {
    InternetSeite internetSeite = getEntity();
    internetSeite.setWahl(getSelectedWahl());
    internetSeite.setStatus(InternetSeiteStatus.KONFIGURATION_NOTWENDIG); // CustomData muss erst konfiguriert werden
    if (getSelectedWahl() != null) {
      Long maxPos = internetSeiteExtendedDAO.findByWahlMaxPosition(getSelectedWahl());
      if (maxPos == null) {
        maxPos = 0L;
      }
      internetSeite.setPosition(maxPos + 1);
    }
  }

  @Override
  public void addProperties(FormBuilder formBuilder, InternetSeite internetSeite) {
    viewFormBuilder.addProperties(formBuilder, internetSeite);
  }

  @Override
  protected void callSave(InternetSeite internetSeite) {
    InternetSeiteCustomData customData = internetSeiteCustomDataFactory.createCustomData(internetSeite.getSeitenTyp(), new InternetCustomDataCreateContext(messages, getSelectedWahl(), internetSeite.getSeitenTyp(), null));
    customData.setStorageEntity(internetSeite.getCustomDataStorage());
    customData.setTechnicalEntity(internetSeite);
    internetSeite.setCustomDataXml(new de.ivu.elect.jee.entity.customdata.CustomDataSerializer().serializeCustomData(customData));
    internetSeite.getCustomDataStorage().clearCustomDataCache();
    super.callSave(internetSeite);
  }

  @Override
  @Redirect
  public String save() {
    InternetSeite internetSeite = getEntity();

    String target = super.save();

    addInfoMessage("internet.seite.created.activate.configure");

    // Spezifische Konfiguration muss noch gesetzt werden, wenn in CustomData gefordert siehe callSave()
    if (!internetSeite.getStatus().isAktiv() && hasPermission(UseCasePermission.INTERNET_SEITE_EDIT)) {
      return internetSeiteEditView.edit(getEntity());
    }

    return target;
  }

  @Override
  @Redirect
  public String cancel() {
    super.cancel();

    return PARENT_VIEW_ID;
  }
}
