package logUtilPlus

import (
	"fmt"
	"goutil/debugUtil"
	"goutil/esLogUtil"
	"goutil/logUtil"
	"log"
	"strings"
)

var (
	enableDebugLog = true
	enableInfoLog  = true
	enableWarnLog  = true
)

// 设置日志级别
// debug / all 时全部开启
// info  记录 info/warn/error/fatal
// warn  记录 warn/error/fatal
// error  记录 error/fatal
func SetLevel(level string) {
	// 大写不敏感
	level = strings.ToLower(level)

	//全部开启
	if level == "debug" || level == "all" {
		// debug / all 时全部开启
		enableInfoLog = true
		enableDebugLog = true
		enableWarnLog = true
	} else if level == "info" {
		// info  记录 info/warn/error/fatal
		enableDebugLog = false
		enableInfoLog = true
		enableWarnLog = true
	} else if level == "warn" {
		// warn  记录 warn/error/fatal
		enableDebugLog = false
		enableInfoLog = false
		enableWarnLog = true
	} else if level == "error" {
		// error  记录 error/fatal
		enableInfoLog = false
		enableDebugLog = false
		enableWarnLog = false
	}
}

// 启动ES日志系统(不调用则不启动ES日志系统，默认记录本地)
// 参数:
//
//	esUrls：ES地址(多个地址使用,分割)
//	name：IndexName
//	serverGroupId：服务器组Id
//
// 返回值：
//
//	结果状态
func Start(esUrls string, name string, serverGroupId int32) {
	esLogUtil.Start(esUrls, name, serverGroupId)
}

// 停止服务
func Stop() {
	esLogUtil.Stop()
}

// 调试日志
func InfoLog(format string, args ...interface{}) {
	if !enableInfoLog {
		return
	}
	PrintAndWriteLog(logUtil.Info, format, args...)
}

// 警告日志
func WarnLog(format string, args ...interface{}) {
	if !enableWarnLog {
		return
	}
	PrintAndWriteLog(logUtil.Warn, format, args...)
}

// 调试日志
func DebugLog(format string, args ...interface{}) {
	if !enableDebugLog {
		return
	}
	PrintAndWriteLog(logUtil.Debug, format, args...)
}

// 错误日志
func ErrorLog(format string, args ...interface{}) {
	PrintAndWriteLog(logUtil.Error, format, args...)
}

// 致命错误日志
func FatalLog(format string, args ...interface{}) {
	PrintAndWriteLog(logUtil.Fatal, format, args...)
}

// 打印到控制台并写日志
func PrintAndWriteLog(logType logUtil.LogType, format string, args ...interface{}) {
	//控制台打印一行
	PrintLog(format, args...)

	if len(args) <= 0 {
		logUtil.NormalLog(format, logType)
		esLogUtil.NormalLog(format, logType)
	} else {
		logUtil.NormalLog(fmt.Sprintf(format, args...), logType)
		esLogUtil.NormalLog(fmt.Sprintf(format, args...), logType)
	}

	if debugUtil.IsDebug() && (logType == logUtil.Warn || logType == logUtil.Error || logType == logUtil.Fatal) {
		StdLog(format, args...)
	}
}

// 控制台打印
func PrintLog(format string, args ...interface{}) {
	//避免非DEBUG模式下组装字符串，提前判断一次
	if debugUtil.IsDebug() {
		debugUtil.Println(fmt.Sprintf(format, args...))
	}
}

// 标准库控制台输出打印
func StdLog(format string, args ...interface{}) {
	if len(args) <= 0 {
		log.Print(format)
	} else {
		log.Print(fmt.Sprintf(format, args...))
	}
}

// 记录未知错误日志
// 参数：
//
//	err：recover获取到的错误对象
//	args：附加参数
func LogUnknownError(err interface{}, args ...string) {
	logUtil.LogUnknownError(err, args...)
}
