package de.ivu.elect.presentation.email;

import java.util.List;

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

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

import de.ivu.elect.business.datei.boundary.DateiExportExtendedDAO;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiExportPK;
import de.ivu.elect.business.email.entity.EmailVorgangType;
import de.ivu.elect.business.person.boundary.PersonendatenListConversationStore;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.faces.HttpHeaderContentSecurityPolicy;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@GroupedConversationScoped
@ConversationGroup(EmailVorgangEinzelEmailCreateView.class)
@Named(EmailVorgangEinzelEmailCreateView.COMPONENT_NAME)
@View(viewId = EmailVorgangEinzelEmailCreateView.VIEW_ID, useCase = UseCasePermission.EMAIL_VORGANG_CREATE)
@OnlineHilfeId(value = "742", mehrfachVergebenOk = true)
@HttpHeaderContentSecurityPolicy(policy="script-src", add="'unsafe-eval'")
public class EmailVorgangEinzelEmailCreateView extends AbstractEmailVorgangCreateView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "emailVorgangMitAnhangCreateView";

  public static final String VIEW_ID = "/email/email-vorgang-einzel-email-create.xhtml";

  @Inject
  private transient GroupedConversation conversation;

  @Inject
  private transient DateiExportExtendedDAO dateiExportExtendedDAO;

  @Inject
  @ConversationGroup(PersonendatenListConversationStore.class)
  private PersonendatenListConversationStore personendatenListConversationStore;

  public EmailVorgangEinzelEmailCreateView() {
    super();
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

  protected List<Personendaten> getSelectedPersonendaten() {
    return personendatenListConversationStore.getEntities();
  }

  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    if (!getEntity().hasEmpfaengerPersonendatenMitEmailAdresse()) {
      addWarningMessage("email.vorgang.create.keine.empfaenger.adresse.error.message.ez");
    }
    return null;
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();
    getEntity().setTyp(EmailVorgangType.EINZEL_EMAIL);
    getEntity().setEmpfaengerPersonendaten(personendatenListConversationStore.getEntities());
    ersetzePlatzhalterWennNurEinEmpfaenger();
  }

  @Redirect
  public String initWithPersonendaten(List<Personendaten> personendaten) {
    resetStateAfterAction();
    conversation.close(); // zunächst eine mögliche bestehende Conversation schließen, um immer mit den Default-Werten zu beginnen
    personendatenListConversationStore.setEntities(personendaten);
    return getViewId();
  }

  @Override
  protected void onClose() {
    personendatenListConversationStore.close();
    conversation.close();
  }

  public String getBtnAttachDocumentLabel() {
    return getMessage("email.vorgang.create.action.attach.document");
  }

  public String getBtnAttachDocumentTitle() {
    return getMessage("email.vorgang.create.action.attach.document.title");
  }

  public boolean isBtnAttachDocumentRendered() {
    return false;
  }

  @Redirect
  public String generateAndAttachDocument() {
    // NOTE: Diesen View auf den ViewStack packen, da er ConversationScoped ist und somit beim mehrmaligen Zurückgehen
    // vom Dokumenten-View nicht mehr auf den Stack gepackt wird.
    viewStack.enter();
    return null;
  }

  public String attachDocumentByPk(DateiExportPK dateiExportPK) {
    if (dateiExportPK==null){
      return attachDocument(null);
    }
    return attachDocument(dateiExportExtendedDAO.findByPrimaryKey(dateiExportPK));
  }

  @Redirect
  public String attachDocument(DateiExport dateiExport) {
    if (dateiExport != null) {
      if (getEntity().hatAnhangMitGleichemDateiname(dateiExport)) {
        addInfoMessage("email.vorgang.create.info.anhang.ersetzt");
      }
      getEntity().addDocument(dateiExport);
    }
    return getViewId();
  }

  @Override
  public boolean isBtnSaveRendered() {
    return super.isBtnSaveRendered() && getEntity().hasEmpfaengerPersonendatenMitEmailAdresse();
  }

  @Override
  public boolean isBtnResetRendered() {
    return getEntity().hasEmpfaengerPersonendatenMitEmailAdresse();
  }
}
