package com.springboot.core.logger;

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

/**
 * 
 * 
 * - TODO(描述类的职责) 自定义日志类 ;后续需要扩展自己添加
 * 
 * @version V1.0
 *          <p style="display:none">
 *          modifyRecord
 *          </p>
 *          <p style="display:none">
 *          version:V1.0,author:252956,date:2017-2-8上午10:22:02,content:TODO
 *          </p>
 * @author 252956
 * @date 2017-2-8上午10:22:02
 * @since
 * 
 */
public class LoggerUtil {

	/**
	 * fqcn
	 */
	private static final String fqcn = LoggerUtil.class.getName();
	/**
	 * NOT_AVAIL
	 */
	private static final String NOT_AVAIL = "?";

	/**
	 * 获取最原始被调用的堆栈信息
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017-2-8上午10:33:00
	 * @param stackTrace
	 * @return
	 * 
	 */
	private static StackTraceElement getStackTraceElement(
			final StackTraceElement[] stackTrace) {
		boolean next = false;
		for (final StackTraceElement element : stackTrace) {
			final String className = element.getClassName();
			if (next && !fqcn.equals(className)) {
				return element;
			}
			if (fqcn.equals(className)) {
				next = true;
			} else if (NOT_AVAIL.equals(className)) {
				break;
			}
		}
		return null;
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)info
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:08
	 * @param message
	 *
	 */
	public static void info(final String message) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.info(message);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)info
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:15
	 * @param message
	 * @param t
	 *
	 */
	public static void info(final String message, Throwable t) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.info(message, t);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)debug
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:21
	 * @param message
	 *
	 */
	public static void debug(final String message) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.debug(message);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)debug
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:27
	 * @param message
	 * @param t
	 *
	 */
	public static void debug(final String message, Throwable t) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.debug(message, t);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)error
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:32
	 * @param message
	 *
	 */
	public static void error(final String message) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.error(message);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)error
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:37
	 * @param message
	 * @param t
	 *
	 */
	public static void error(final String message, Throwable t) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.error(message, t);
	}

	/**
	 * 
	 * 
	 * <p>
	 * TODO(方法详细描述说明、方法参数的具体涵义)warn
	 * </p>
	 * 
	 * @author 252956
	 * @date 2017年8月30日上午10:16:42
	 * @param message
	 *
	 */
	public static void warn(final String message) {
		StackTraceElement caller = getStackTraceElement(Thread.currentThread()
				.getStackTrace());
		if (null == caller)
			return;
		Logger log = LoggerFactory
				.getLogger(caller.getClassName() + "." + caller.getMethodName()
						+ "() Line: " + caller.getLineNumber());
		log.warn(message);
	}
}