
package de.ivu.elect.jee.session;

import java.io.Serializable;
import java.text.DateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;

import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.CategoryAxis;
import org.primefaces.model.chart.LineChartModel;
import org.primefaces.model.chart.LineChartSeries;

import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.security.ActiveUsers;

/**
 * ELECTMUC-205
 */
@SessionScoped
public class SessionController implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final int MAX_ANZAHL_EINTRAEGE = 100;

  @Inject
  private transient Messages messages;

  @Inject
  private transient ActiveUsers activeUsers;

  private LineChartModel sesssionModel;

  private LineChartSeries sessionSerieHttpSessions;

  private LineChartSeries sessionSerieAngemeldeteNutzer;

  public SessionController() {
    super();
  }

  private void createSessionModel() {
    sesssionModel = new LineChartModel();

    sessionSerieHttpSessions = new LineChartSeries();
    sessionSerieHttpSessions.setLabel(messages.getMessageForMessageKey("session.statistics.active.http.sessions"));
    sesssionModel.addSeries(sessionSerieHttpSessions);

    sessionSerieAngemeldeteNutzer = new LineChartSeries();
    sessionSerieAngemeldeteNutzer.setLabel(messages.getMessageForMessageKey("session.statistics.users"));
    sesssionModel.addSeries(sessionSerieAngemeldeteNutzer);

    sesssionModel.setLegendPosition("ne");
    sesssionModel.getAxes().put(AxisType.X, new CategoryAxis("Zeit"));
    sesssionModel.getAxis(AxisType.X).setTickAngle(270);
    sesssionModel.getAxis(AxisType.Y).setLabel(messages.getMessageForMessageKey("session.statistics.unit"));
    sesssionModel.getAxis(AxisType.Y).setMin(0);
    sesssionModel.setZoom(true);
  }

  public LineChartModel getSessionModel() {
    if (sesssionModel == null) {
      createSessionModel();
    }

    long aktiveSessions = SessionCounterListener.getAnzahlSessions();
    long angemeldeteNutzer = activeUsers.getActiveUserCount();

    String dateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.GERMANY).format(new Date());

    sessionSerieHttpSessions.set(dateTime, aktiveSessions);
    sessionSerieAngemeldeteNutzer.set(dateTime, angemeldeteNutzer);

    kuerzen();

    return sesssionModel;
  }

  private void kuerzen() {
    kuerzen(sessionSerieHttpSessions.getData());
    kuerzen(sessionSerieAngemeldeteNutzer.getData());
  }

  private void kuerzen(Map<Object, Number> data) {
    LinkedHashMap map = (LinkedHashMap) data;

    while (data.size() > MAX_ANZAHL_EINTRAEGE) {
      Object key = map.keySet().iterator().next();
      map.remove(key);
    }
  }
}
