package iot.lidee.sip.conf;

import gov.nist.core.StackLogger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
public class StackLoggerImpl implements StackLogger {

	/**
	 * 完全限定类名(Fully Qualified Class Name)，用于定位日志位置
	 */
	private static final String FQCN = StackLoggerImpl.class.getName();

	/**
	 * 获取栈中类信息(以便底层日志记录系统能够提取正确的位置信息(方法名、行号))
	 * @return LocationAwareLogger
	 */
	private static LocationAwareLogger getLocationAwareLogger() {
		return (LocationAwareLogger) LoggerFactory.getLogger(new Throwable().getStackTrace()[4].getClassName());
	}


	/**
	 * 封装打印日志的位置信息
	 * @param level   日志级别
	 * @param message 日志事件的消息
	 */
	private static void log(int level, String message) {
		LocationAwareLogger locationAwareLogger = getLocationAwareLogger();
		locationAwareLogger.log(null, FQCN, level, message, null, null);
	}

	/**
	 * 封装打印日志的位置信息
	 * @param level   日志级别
	 * @param message 日志事件的消息
	 */
	private static void log(int level, String message, Throwable throwable) {
		LocationAwareLogger locationAwareLogger = getLocationAwareLogger();
		locationAwareLogger.log(null, FQCN, level, message, null, throwable);
	}

	@Override
	public void logStackTrace() {

	}

	@Override
	public void logStackTrace(int traceLevel) {
		System.out.println("traceLevel: " + traceLevel);
	}

	@Override
	public int getLineCount() {
		return 0;
	}

	@Override
	public void logException(Throwable ex) {

	}

	@Override
	public void logDebug(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public void logDebug(String message, Exception ex) {
		log(LocationAwareLogger.INFO_INT, message, ex);
	}

	@Override
	public void logTrace(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public void logFatalError(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public void logError(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public boolean isLoggingEnabled() {
		return true;
	}

	@Override
	public boolean isLoggingEnabled(int logLevel) {
		return true;
	}

	@Override
	public void logError(String message, Exception ex) {
		log(LocationAwareLogger.INFO_INT, message, ex);
	}

	@Override
	public void logWarning(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public void logInfo(String message) {
		log(LocationAwareLogger.INFO_INT, message);
	}

	@Override
	public void disableLogging() {

	}

	@Override
	public void enableLogging() {

	}

	@Override
	public void setBuildTimeStamp(String buildTimeStamp) {

	}

	@Override
	public void setStackProperties(Properties stackProperties) {

	}

	@Override
	public String getLoggerName() {
		return null;
	}
}
