package core

import (
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"sundynix-go/core/internal"
	"sundynix-go/global"
	"sundynix-go/utils"
)

// Zap 函数用于初始化并返回一个 zap.Logger 实例。
// 该函数会检查日志目录是否存在，如果不存在则创建该目录。
// 根据配置中的日志级别，创建对应的 zapcore.Core，并将它们合并为一个 zap.Logger。
// 如果配置中启用了显示行号，则会在日志中添加调用者信息。
// 返回值:
//   - logger: 初始化后的 zap.Logger 实例，用于记录日志。
func Zap() (logger *zap.Logger) {
	// 检查日志目录是否存在，如果不存在则创建
	if ok, _ := utils.PathExist(global.Config.Zap.Director); !ok {
		fmt.Printf("日志目录 %v 不存在,创建中...\n", global.Config.Zap.Director)
		_ = os.Mkdir(global.Config.Zap.Director, os.ModePerm)
	}

	// 获取配置中的日志级别，并初始化对应的 zapcore.Core
	levels := global.Config.Zap.Levels()
	length := len(levels)
	cores := make([]zapcore.Core, 0, length)
	for i := 0; i < length; i++ {
		core := internal.NewZapCore(levels[i])
		cores = append(cores, core)
	}

	// 将所有的 zapcore.Core 合并为一个 zap.Logger
	logger = zap.New(zapcore.NewTee(cores...))

	// 如果配置中启用了显示行号，则添加调用者信息
	if global.Config.Zap.ShowLine {
		logger = logger.WithOptions(zap.AddCaller())
	}

	return logger
}
