
package de.ivu.elect.presentation.exchange;

import static java.util.Arrays.asList;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.lang3.StringUtils;
import org.apache.deltaspike.core.api.scope.ViewAccessScoped;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import de.ivu.elect.business.datei.boundary.DateiImportConversationSelect;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.menu.AbstractMenuModelBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.security.StartViewResolver;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@Named
@ViewAccessScoped
@OnlineHilfeId("237")
@View(viewId = DateiImportBerichtView.VIEW_ID, useCase = UseCasePermission.OHNE)
public class DateiImportBerichtView implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String VIEW_ID = "/exchange/datei-import-bericht.xhtml";

  @Inject
  private transient DateiImportConversationSelect dateiImportConversationSelect;

  @Inject
  private transient DateiImportBerichtLastViewConversationSelect dateiImportBerichtLastViewConversationSelect;

  @Inject
  private transient DateiImportMetaForEntityConversationSelect dateiImportMetaForEntityConversationSelect;

  @Inject
  private transient ImportDescriptionSelect importDescriptionSelect;

  @Inject
  private transient StartViewResolver startViewResolver;

  @Inject
  private transient Messages messages;

  private List<String> lines;

  @PreConditionCheck
  public String preConditionCheck() {
    if (!dateiImportConversationSelect.isSelected()) {
      messages.addErrorMessage("datei.import.edit.action.import.bericht.keine.datei.ausgewaehlt");

      return startViewResolver.getStartViewId();
    }

    return null;
  }

  public boolean isBtnCancelRendered() {
    return true;
  }

  @Redirect
  public String cancel() {
    if (dateiImportBerichtLastViewConversationSelect.isSelected()) {
      return dateiImportBerichtLastViewConversationSelect.getLastViewId();
    }

    if (importDescriptionSelect.isSelected()) {
      return importDescriptionSelect.getImportSearchViewId();
    }

    return startViewResolver.getStartViewId();
  }

  public DateiImport getDateiImport() {
    return dateiImportConversationSelect.getEntity();
  }

  public void setDateiImport(DateiImport dateiImport) {
    dateiImportConversationSelect.setEntity(dateiImport);
  }

  public List<String> getLines() {
    if (lines == null) {
      String bericht = getBericht();
      if (StringUtils.isNotBlank(bericht)) {
        lines = asList(bericht.split("\n"));
      }
    }

    return lines;
  }

  public String getViewId() {
    return VIEW_ID;
  }

  public AbstractMenuModelBuilder getPageMenu() {
    if (isPageMenuUsed()) {
      return FacesContextUtil.getElValue("#{" + importDescriptionSelect.getPageMenuComponentName() + "}", AbstractMenuModelBuilder.class);
    }

    return null;
  }

  public boolean isPageMenuUsed() {
    return importDescriptionSelect.getPageMenuComponentName() != null;
  }

  public Meta getMetaForEntity() {
    return dateiImportMetaForEntityConversationSelect.getMetaForEntity();
  }

  public boolean isSpecificPerWahlOrWahltermin() {
    return importDescriptionSelect.isSpecificPerWahlOrWahltermin();
  }

  public boolean isBtnDownloadBerichtRendered() {
    return isNotBlank(getBericht());
  }

  public boolean isBtnDownloadBerichtDisabled() {
    return false;
  }

  private String getBericht() {

    DateiImport dateiImport = getDateiImport();
    if (dateiImport == null) {
      return null;
    }
    return dateiImport.getCustomData(DateiImportBerichtCustomData.class).toString(messages);
  }

  public String getBtnDownloadBerichtLabel() {
    return messages.getMessageForMessageKey("datei.import.bericht.download");
  }

  public StreamedContent getImportBericht() {
    FileType fileType = FileType.TXT;

    String bericht = getBericht();
    if (bericht == null) {
      bericht = "";
    }
    byte[] bytes = bericht.getBytes(StandardCharsets.UTF_8);

    return DefaultStreamedContent.builder()
        .stream(() -> new ByteArrayInputStream(bytes))
        .contentType(fileType.getDefaultMimeType())
        .name("datei-import-bericht." + fileType.getFileExtension())
        .contentEncoding(StandardCharsets.UTF_8.name())
        .build();
  }
}
