package at.gv.egiz.pdfas.web.stats.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import at.gv.egiz.pdfas.web.stats.StatisticBackend;
import at.gv.egiz.pdfas.web.stats.StatisticEvent;

public class StatisticFileBackend implements StatisticBackend {

	public static final String NAME = "StatisticFileBackend";

	public static final String STATISTIC_LOGGER = "at.gv.egiz.pdfas.web.statistics";

	private static final Logger technical_logger = LoggerFactory
			.getLogger(StatisticFileBackend.class);
	private static final Logger statistic_logger = LoggerFactory
			.getLogger(STATISTIC_LOGGER);

	private void addCSVValue(String value, StringBuilder sb) {
		if (value != null) {
			value = value.replace(';', ',');
			sb.append(value);
		}
		sb.append(";");
	}

	private String getLogEntry(StatisticEvent statisticEvent) {
		StringBuilder sb = new StringBuilder();
		addCSVValue(String.valueOf(statisticEvent.getTimestamp()), sb);
		addCSVValue(statisticEvent.getOperation().getName(), sb);
		addCSVValue(statisticEvent.getDevice(), sb);
		addCSVValue(statisticEvent.getSource().getName(), sb);
		addCSVValue(statisticEvent.getProfileId(), sb);
		addCSVValue(String.valueOf(statisticEvent.getFilesize()), sb);
		addCSVValue(statisticEvent.getUserAgent(), sb);
		addCSVValue(statisticEvent.getStatus().getName(), sb);
		addCSVValue((statisticEvent.getException() != null) ? statisticEvent
				.getException().getMessage() : null, sb);
		addCSVValue(String.valueOf(statisticEvent.getErrorCode()), sb);
		addCSVValue(String.valueOf(statisticEvent.getDuration()), sb);
		return sb.toString();
	}

	@Override
	public void storeEvent(StatisticEvent statisticEvent) {
		String entry = getLogEntry(statisticEvent);
		technical_logger.trace("Stat log entry: {}", entry);
		statistic_logger.info("{}", entry);
	}

	@Override
	public String getName() {
		return NAME;
	}

}