package logUtil

import (
	"fmt"
	"runtime"
	"strings"
)

const (
	con_MIN_SKIP = 1
	con_MAX_SKIP = 10
)

// InfoLog 信息日志记录
// 	format:日志格式
// 	args:参数列表
func InfoLog(format string, args ...interface{}) {
	for _, log := range logs {
		log.InfoLog(format, args...)
	}
}

// WarnLog 警告日志记录
// 	format:日志格式
// 	args:参数列表
func WarnLog(format string, args ...interface{}) {
	for _, log := range logs {
		log.WarnLog(format, args...)
	}
}

// DebugLog 调试日志记录
// 	format:日志格式
// 	args:参数列表
func DebugLog(format string, args ...interface{}) {
	for _, log := range logs {
		log.DebugLog(format, args...)
	}
}

// ErrorLog 错误日志记录
//	format:日志格式
//	args:参数列表
func ErrorLog(format string, args ...interface{}) {
	for _, log := range logs {
		log.ErrorLog(format, args...)
	}
}

// FatalLog 致命错误日志记录
// 	format:日志格式
// 	args:参数列表
func FatalLog(format string, args ...interface{}) {
	for _, log := range logs {
		log.FatalLog(format, args...)
	}
}

// Close
// @description: 关闭日志
// parameter:
//		@waitFinish:是否等待关闭完成
// return:
func Close(waitFinish bool) {
	for _, log := range logs {
		log.CloseLog(waitFinish)
	}
}

//--------------------------Deprecated methods start----------------------------

// Log 日志记录
// Deprecated: use XXXLog api instead
func Log(logInfo string, lv LogType, ifIncludeHour bool) {
	switch lv {
	case Info:
		InfoLog(logInfo)
	case Warn:
		WarnLog(logInfo)
	case Debug:
		DebugLog(logInfo)
	case Error:
		ErrorLog(logInfo)
	case Fatal:
		FatalLog(logInfo)
	}
}

// NormalLog 日志记录
// Deprecated: use XXXLog api instead
func NormalLog(logInfo string, level LogType) {
	Log(logInfo, level, true)
}

// LogAndPrint 日志记录
// Deprecated: use XXXLog api instead
func LogAndPrint(logInfo string, level LogType) {
	NormalLog(logInfo, level)
	fmt.Println(logInfo)
}

// LogUnknownError 日志记录
func LogUnknownError(r interface{}, args ...string) {
	buf := strings.Builder{}
	buf.WriteString(fmt.Sprintf("通过recover捕捉到的未处理异常：%v \n", r))

	// 获取附加信息
	if len(args) > 0 {
		buf.WriteString("附加信息：")
		buf.WriteString(strings.Join(args, "-"))
		buf.WriteString("\n")
	}

	// 获取堆栈信息
	for skip := con_MIN_SKIP; skip <= con_MAX_SKIP; skip++ {
		_, file, line, ok := runtime.Caller(skip)
		if !ok {
			break
		}
		buf.WriteString(fmt.Sprintf("skip = %d, file = %s, line = %d \n", skip, file, line))
		buf.WriteString("\n")
	}

	ErrorLog(buf.String())
}

//--------------------------Deprecated methods end----------------------------
