#include "logger.h"

#include <stdlib.h>
#include <iostream>

namespace kiss {

std::ostream *Logger::stream = &std::cerr;
eLogLevel Logger::level = LOG_LEVEL_WARNING;
const char* sLoggerLevel[] = { "ERROR  ", "WARNING", "INFO  ", "DEBUG " };

class EnvLogger {
public:
	EnvLogger() {
		Logger::loadEnvLogLevel();
	}
};
static EnvLogger _env_log_;

Logger::Logger(eLogLevel level) {
	time_t rawtime;
	struct tm * timeinfo;
	char buffer[80];

	time(&rawtime);
	timeinfo = localtime(&rawtime);

	strftime(buffer, 80, "%Y-%m-%d %H:%M:%S ", timeinfo);
	*stream << buffer;
	*stream << "[" << sLoggerLevel[level] << "] ";
}

Logger::~Logger() {
	*stream << std::endl;
}

std::ostream &Logger::getLogStream() {
	return (*stream);
}

void Logger::setLogStream(std::ostream *s) {
	stream = s;
}

void Logger::setLogStream(std::ostream &s) {
	stream = &s;
}

void Logger::setLogLevel(eLogLevel l) {
	level = l;
}
eLogLevel Logger::getLogLevel() {
	return (level);
}

void Logger::loadEnvLogLevel() {
	if (::getenv("LOG_LEVEL")) {
		int level = atoi(::getenv("LOG_LEVEL"));
		switch (level) {
		case LOG_LEVEL_ERROR:
			Logger::setLogLevel(LOG_LEVEL_ERROR);
			break;
		case LOG_LEVEL_WARNING:
			Logger::setLogLevel(LOG_LEVEL_WARNING);
			break;
		case LOG_LEVEL_INFO:
			Logger::setLogLevel(LOG_LEVEL_INFO);
			break;
		case LOG_LEVEL_DEBUG:
			Logger::setLogLevel(LOG_LEVEL_DEBUG);
			break;
		default:
			std::cerr << "kiss::Logger: unknown log level in LOG_LEVEL '"
					<< level << " values from 0-3 expected." << std::endl;
			break;
		}
	}
}

} // namespace kiss

