
package de.ivu.elect.presentation.system;

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

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

import org.primefaces.model.DefaultStreamedContent;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.system.boundary.HibernateStatistik;
import de.ivu.elect.business.system.entity.HibernateCollectionStatistik;
import de.ivu.elect.business.system.entity.HibernateEntityStatistik;
import de.ivu.elect.business.system.entity.HibernateQueryStatistik;
import de.ivu.elect.business.system.entity.HibernateSecondLevelCacheStatistik;
import de.ivu.elect.business.system.entity.HibernateStatistikEntry;
import de.ivu.elect.jee.faces.download.DownloadAction;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.view.AbstractView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@RequestScoped
@OnlineHilfeId(value = "541")
@Named(HibernateStatistikView.COMPONENT_NAME)
@View(viewId = HibernateStatistikView.VIEW_ID, useCase = UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
public class HibernateStatistikView extends AbstractView {

  private static final long serialVersionUID = 1L;

  public static final String VIEW_ID = "/system/hibernate-statistik.xhtml";

  public static final String COMPONENT_NAME = "hibernateStatistikView";

  @Inject
  HibernateStatistik hibernateStatistik;

  @Inject
  private DownloadAction downloadAction;

  private List<HibernateCollectionStatistik> collectionStatistiken;

  private List<HibernateStatistikEntry> hibernateStatistikEntries;

  private List<HibernateQueryStatistik> queryStatistiken;

  private List<HibernateEntityStatistik> entityStatistiken;

  private List<HibernateSecondLevelCacheStatistik> secondLevelCacheStatistiken;

  @Redirect
  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String aktualisieren() {
    // View ist RequestScoped --> nichts zu tun
    return null;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String aktiviereStatistik() {
    hibernateStatistik.aktiviereStatistik();
    return VIEW_ID;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String resetCache() {
    hibernateStatistik.resetCache();
    addInfoMessage("second.level.cache.reset");
    return VIEW_ID;
  }

  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String logStatistics() {
    String log = hibernateStatistik.logStatistics(true, "\n");
    addInfoMessage("hibernate.statistics.log");
    DefaultStreamedContent.Builder streamContentBuilder = DefaultStreamedContent.builder()
        .stream(() -> new ByteArrayInputStream(log.getBytes(StandardCharsets.UTF_8)))
        .contentType("text/plain")
        .name("hibernate.txt")
        .contentEncoding(StandardCharsets.UTF_8.name());
    downloadAction.download(streamContentBuilder.build());
    return null;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String deaktiviereStatistik() {
    hibernateStatistik.deaktiviereStatistik();
    return VIEW_ID;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.HIBERNATE_STATISTIK_SEARCH)
  public String resetStatistik() {
    hibernateStatistik.resetStatistik();
    return VIEW_ID;
  }

  public boolean isStatistikAktiviert() {
    return hibernateStatistik.isStatistikAktiviert();
  }

  public List<HibernateCollectionStatistik> getCollectionStatistiken() {
    if (collectionStatistiken == null) {
      collectionStatistiken = hibernateStatistik.getCollectionStatistiken();
    }

    return collectionStatistiken;
  }

  public List<HibernateStatistikEntry> getStatistikEntries() {
    if (hibernateStatistikEntries == null) {
      hibernateStatistikEntries = hibernateStatistik.getStatistikEntries();
    }

    return hibernateStatistikEntries;

  }

  public List<HibernateQueryStatistik> getQueryStatistiken() {
    if (queryStatistiken == null) {
      queryStatistiken = hibernateStatistik.getQueryStatistiken();
    }

    return queryStatistiken;
  }

  public List<HibernateEntityStatistik> getEntityStatistiken() {
    if (entityStatistiken == null) {
      entityStatistiken = hibernateStatistik.getEntityStatistiken();
    }

    return entityStatistiken;
  }

  public List<HibernateSecondLevelCacheStatistik> getSecondLevelCacheStatistiken() {
    if (secondLevelCacheStatistiken == null) {
      secondLevelCacheStatistiken = hibernateStatistik.getSecondLevelCacheStatistiken();
    }

    return secondLevelCacheStatistiken;
  }
}
