package log

import (
	"fmt"
	"leafstalk/otherutils/system"
	"runtime/debug"

	"go.uber.org/zap"
)

// ZapLogger 包装了一个 Logger 实例
type ZapLogger struct {
	sugarLogger *zap.SugaredLogger
	writer      *asyncWriter
}

var (
	logger *ZapLogger
)

func InitCustomLogger(appName string) Logger {
	isWriteToConsole := false
	if system.IsWindows() {
		isWriteToConsole = true // Windows默认开启控制台
	}

	filePath := fmt.Sprintf("../logs/%s", appName)
	sugarLogger, asyncWriter := InitLogger(filePath, isWriteToConsole)

	logger = &ZapLogger{
		sugarLogger: sugarLogger,
		writer:      asyncWriter,
	}
	return logger

	// close := func() {
	// 	log.Sync()
	// 	close(w.entryChan)
	// 	w.wg.Wait()
	// }

	// l := new(CustomLogger)
	// l.logger = log
	// l.Close = close
	// logger = l
	// return l
}

// func L() *CustomLogger {
// 	return logger
// }

// Info 记录一条信息级别的日志
func (c *ZapLogger) Info(args ...interface{}) {
	c.sugarLogger.Info(args...)
}

// Infof 格式化记录一条信息级别的日志
func (c *ZapLogger) Infof(format string, args ...interface{}) {
	c.sugarLogger.Infof(format, args...)
}

// Infoln 记录一条信息级别的日志，并在末尾添加换行符
// func (c *ZapLogger) Infow(msg string, keysAndValues ...interface{}) {
// 	c.sugarLogger.Infow(msg, keysAndValues...)
// }

// Warn 记录一条警告级别的日志
func (c *ZapLogger) Warn(args ...interface{}) {
	c.sugarLogger.Warn(args...)
}

// Warnf 格式化记录一条警告级别的日志
func (c *ZapLogger) Warnf(format string, args ...interface{}) {
	c.sugarLogger.Warnf(format, args...)
}

// Warnln 记录一条警告级别的日志，并在末尾添加换行符
// func (c *ZapLogger) Warnw(msg string, keysAndValues ...interface{}) {
// 	c.sugarLogger.Warnw(msg, keysAndValues...)
// }

// Error 记录一条错误级别的日志
func (c *ZapLogger) Error(args ...interface{}) {
	c.sugarLogger.Error(args...)
}

// Errorf 格式化记录一条错误级别的日志
func (c *ZapLogger) Errorf(format string, args ...interface{}) {
	c.sugarLogger.Errorf(format, args...)
}

// Errorln 记录一条错误级别的日志，并在末尾添加换行符
// func (c *ZapLogger) Errorw(msg string, keysAndValues ...interface{}) {
// 	c.sugarLogger.Errorw(msg, keysAndValues...)
// }

// Debug 记录一条调试级别的日志
func (c *ZapLogger) Debug(args ...interface{}) {
	c.sugarLogger.Debug(args...)
}

// Debugf 格式化记录一条调试级别的日志
func (c *ZapLogger) Debugf(format string, args ...interface{}) {
	c.sugarLogger.Debugf(format, args...)
}

// Debugln 记录一条调试级别的日志，并在末尾添加换行符
// func (c *ZapLogger) Debugw(msg string, keysAndValues ...interface{}) {
// 	c.sugarLogger.Debugw(msg, keysAndValues...)
// }

// Panic 记录一条致命级别的日志并触发 panic
func (c *ZapLogger) Panic(args ...interface{}) {
	c.sugarLogger.Error(args...)
	c.sugarLogger.Panic(string(debug.Stack()))
}

// Panicf 格式化记录一条致命级别的日志并触发 panic
func (c *ZapLogger) Panicf(format string, args ...interface{}) {
	c.sugarLogger.Errorf(format, args...)
	c.sugarLogger.Panic(string(debug.Stack()))
}

// Panicln 记录一条致命级别的日志并触发 panic，并在末尾添加换行符
// func (c *ZapLogger) Panicw(msg string, keysAndValues ...interface{}) {
// 	c.sugarLogger.Errorw(msg, keysAndValues...)
// 	c.sugarLogger.Panic(string(debug.Stack()))
// }

// Fatal 记录一条致命级别的日志并调用 os.Exit(1)
func (c *ZapLogger) Fatal(args ...interface{}) {
	c.sugarLogger.Error(args...)
	c.sugarLogger.Fatal(string(debug.Stack()))
}

// Fatalf 格式化记录一条致命级别的日志并调用 os.Exit(1)
func (c *ZapLogger) Fatalf(format string, args ...interface{}) {
	c.sugarLogger.Errorf(format, args...)
	c.sugarLogger.Fatal(string(debug.Stack()))
}

func (zl *ZapLogger) Stop() {
	zl.sugarLogger.Sync() // 同步缓存
	zl.writer.Stop()      // 停止异步写入器
}
