package io.github.lunasaw.sip.common.conf;

import java.util.Properties;

import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
import org.springframework.stereotype.Component;

import gov.nist.core.StackLogger;

@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;
    }
}