
package de.ivu.elect.presentation.lokalisierung;

import java.util.List;

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

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

import de.ivu.elect.business.lokalisierung.boundary.LokalisierungEdit;
import de.ivu.elect.business.lokalisierung.control.LokalisierungInit;
import de.ivu.elect.business.lokalisierung.entity.Lokalisierung;
import de.ivu.elect.business.lokalisierung.entity.LokalisierungMeta;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.AbstractElectEditView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.KeineOnlineHilfe;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

/**
 * NICHT als Vorlage für weitere Entitäten benutzen...verwendet im Editor mehr als eine Entität
 */

@OnlineHilfeId(KeineOnlineHilfe.KEINE_ONLINE_HILFE)
@RequestScoped
@Named(LokalisierungBulkEditView.COMPONENT_NAME)
@View(viewId = LokalisierungBulkEditView.VIEW_ID, useCase = UseCasePermission.LOKALISIERUNG_EDIT)
public class LokalisierungBulkEditView extends AbstractElectEditView<Lokalisierung> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "lokalisierungBulkEditView";

  public static final String VIEW_ID = "/lokalisierung/lokalisierung-bulk-edit.xhtml";

  private static final Lokalisierung EMPTY = new Lokalisierung();

  @Inject
  protected LokalisierungEdit edit;

  @Inject
  protected LokalisierungInit lokalisierungInit;

  @Inject
  protected LokalisierungMeta entityMeta;

  @Inject
  @ConversationGroup(LokalisierungBulkConversationStore.class)
  protected LokalisierungBulkConversationStore conversationStore;

  public LokalisierungBulkEditView() {
    super();
  }

  @Override
  @Redirect
  public String cancel() {
    conversationStore.close();

    return goBack(getParentViewId());
  }

  @Redirect
  public String edit(List<Lokalisierung> entities) {
    conversationStore.setEntities(entities);
    return getViewId();
  }

  @Override
  @Redirect
  public String delete() {
    throw new UnsupportedOperationException("This is NOT implemented");
  }

  public String getViewId() {
    return VIEW_ID;
  }

  protected String getParentViewId() {
    return AbstractLokalisierungEditNoScopeView.PARENT_VIEW_ID;
  }

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

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.LOKALISIERUNG_EDIT)
  public String save() {
    List<Lokalisierung> lokalisierungen = getLokalisierungen();

    edit.save(lokalisierungen);

    // Zweite Transaktion für Cache...ExtendedDAO und so...
    lokalisierungInit.aktualisiereLokalisierungStore();

    addMessageSaveSuccess();

    conversationStore.close();

    return goBack(getParentViewId());
  }

  protected void addMessageSaveSuccess() {
    addInfoMessage("entity.edit.action.save.success.message", entityMeta.getMehrzahlMessage());
  }

  private List<Lokalisierung> getLokalisierungen() {
    return conversationStore.getEntities();
  }

  @Override
  protected Lokalisierung getEntity() {
    return EMPTY;
  }

  @Override
  protected boolean isGebietBearbeitenRechtPruefen() {
    return false;
  }

  @Override
  protected boolean isSavePermissionVorhanden() {
    return hasPermission(UseCasePermission.LOKALISIERUNG_EDIT);
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Lokalisierung ignored) {
    for (Lokalisierung lokalisierung : getLokalisierungen()) {
      formBuilder.addSeparator(Messages.LOCALIZED_MESSAGE_ONLY_MSG_KEY, lokalisierung.getWertVerwendet());
      formBuilder.addProperty(lokalisierung.getProperties().getSchluesselProperty()).readonly();
      formBuilder.addProperty(lokalisierung.getProperties().getLocaleProperty()).readonly();
      formBuilder.addProperty(lokalisierung.getProperties().getWertPropertydateiProperty()).readonly();
      formBuilder.addProperty(lokalisierung.getProperties().getWertGeaendertProperty());
    }
  }

  @Redirect
  @Override
  public String reset() {
    super.reset();
    List<Lokalisierung> entities = getLokalisierungen();
    conversationStore.close();
    return edit(entities);
  }
}
