package logger

import (
	"fmt"
	"github.com/ichunt2019/log"
	"go_sku_server/pkg/config"
	"strings"
	"sync"
)

const (
	LogLevelDebug = iota
	LogLevelTrace
	LogLevelInfo
	LogLevelWarn
	LogLevelError
	LogLevelFatal
)

var (
	logD map[string]logger.LogInterface
)
var once sync.Once

func LogInit() {
	once.Do(func() {
		fmt.Print("日志初始化开始")
		configs := config.GetSectionValues("log_config")
		logD = make(map[string]logger.LogInterface)
		for _, configOne := range configs {
			sliceConfig := strings.Split(configOne, ",")
			log := getLog(sliceConfig[0], sliceConfig[1], "0")

			logD[sliceConfig[0]] = log
		}
	})
}

/**
@param path 路径 比如sku_save 即文件夹是 sku 文件名类似 是save_2020-12-10.log
@param msg  错误文本
@Level  默认是 logger.LogLevelInfo
示例
*/
func SyncInsert(path string, msg string, Levels ...int) {

	log := getLog(path, "10", "1")
	level := LogLevelInfo
	if len(Levels) > 0 {
		level = Levels[0]
	}
	switch level {
	case LogLevelDebug:
		log.Debug(msg)
	case LogLevelTrace:
		log.Trace(msg)
	case LogLevelInfo:
		log.Info(msg)
	case LogLevelWarn:
		log.Warn(msg)
	case LogLevelFatal:
		log.Fatal(msg)
	case LogLevelError:
		log.Error(msg)
	default:
		log.Info(msg)
	}
	log.SyncWait()
}

//入口
func Select(logFiled string) logger.LogInterface {
	log, ok := logD[logFiled]
	if !ok {
		panic("log配置:" + logFiled + "不存在")
	}
	if log, ok := log.(logger.LogInterface); ok {
		return log
	}
	panic("type not logger.LogInterface")
}

//内部方法,获取log
func getLog(path string, chan_size string, openSync string) logger.LogInterface {
	logConfig := make(map[string]string)
	logConfig["log_chan_size"] = "10"
	slicePath := strings.Split(path, "_")
	if slicePath[0] == "" || slicePath[1] == "" {
		panic("配置文件出错:文件/路径配置出错;提示:第一个参数格式应为A_B")
	}
	logConfig["log_path"] = "logs/" + slicePath[0]
	logConfig["log_name"] = slicePath[1]
	if openSync == "1" {
		logConfig["open_sync"] = "1"
	}
	if chan_size != "" {
		logConfig["log_chan_size"] = chan_size
	}
	log, err := logger.InitLogger("file", logConfig)
	if err != nil {
		panic("初始化log包出错:")
	}
	log.Init()
	return log
}

func SetUp() (err error) {
	logConfig := make(map[string]string)
	logConfig["log_path"] = "logs"
	logConfig["log_chan_size"] = "5"
	//err = logger.InitLogger("file", logConfig)
	if err != nil {
		return err
	}
	logger.Init()
	return
}