package logger

import (
	"fmt"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"path"
	"strings"
	"time"
)

// 定义自己的Writer
type RdsLoggerWriter struct {
	logger *logrus.Logger
}

// 实现gorm/logger.Writer接口
func (r *RdsLoggerWriter) Printf(format string, v ...interface{}) {
	r.logger.Info(fmt.Sprintf(format, v...))
}

type RdsLogFormatter struct{}

func (s *RdsLogFormatter) Format(entry *logrus.Entry) ([]byte, error) {

	local, _ := time.LoadLocation("Asia/Shanghai")
	timestamp := time.Now().In(local).Format("2006-01-02 15:04:05")

	//fmt.Println(entry.Data)
	msg := fmt.Sprintf(
		"[GOID:%d] [%s] %s %s\n",
		getGID(),
		strings.ToUpper(entry.Level.String()),
		timestamp,
		entry.Message)
	return []byte(msg), nil
}

func newRdsLoggerWriter(LogFilePath string, LogFileName string, LoggerInstance *logrus.Logger, RunMode string) *RdsLoggerWriter {

	//配置logrus

	fileName := path.Join(LogFilePath, LogFileName)

	outSelect(LoggerInstance, RunMode)

	logWriter, _ := rotatelogs.New(
		// 分割后的文件名称
		fileName+".%Y%m%d.log",

		// 生成软链,指向最新日志文件
		rotatelogs.WithLinkName(fileName),

		// 设置最大保存时间(7天)
		rotatelogs.WithMaxAge(7*24*time.Hour),

		// 设置日志切割时间间隔(1天)
		rotatelogs.WithRotationTime(24*time.Hour),
	)

	writeMap := lfshook.WriterMap{
		logrus.InfoLevel:  logWriter,
		logrus.FatalLevel: logWriter,
		logrus.DebugLevel: logWriter,
		logrus.WarnLevel:  logWriter,
		logrus.ErrorLevel: logWriter,
		logrus.PanicLevel: logWriter,
	}

	lfHook := lfshook.NewHook(writeMap, &RdsLogFormatter{})

	// 新增 Hook
	LoggerInstance.AddHook(lfHook)

	return &RdsLoggerWriter{logger: LoggerInstance}
}