package logging

import (
	"../../pkg/file"
	"../setting"
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"log"
	"os"
	"path/filepath"
	"runtime"
	"time"
)

type Level int

var (
	F *os.File

	DefaultPrefix      = ""
	DefaultCallerDepth = 2
	DefaultPath string

	logger     *log.Logger
	logPrefix  = ""
	levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
)

const (
	DEBUG Level = iota
	INFO
	WARNING
	ERROR
	FATAL
)

func Setup() {
	var err error
	//tchan :=time.Tick(24*time.Hour)
	DefaultPath,_ = setting.GetCurrentPath()
	filePath := DefaultPath+getLogFilePath()
	fileName := getLogFileName()
	F, err = file.MustOpen(fileName, filePath)
	if err != nil {
		log.Fatalf("logging.Setup err: %v", err)
	}
	println(filePath)
	logger = log.New(F, DefaultPrefix, log.LstdFlags)
	//gin.DefaultWriter = io.MultiWriter(F, os.Stdout)
	go func(){
		tchan :=time.Tick(24*time.Hour)
	for {
		select {
		case <-tchan:
			F.Close()
			//fmt.Println("t1定时器")
			filePath := DefaultPath+getLogFilePath()
			fileName := getLogFileName()
			F, err = file.MustOpen(fileName, filePath)
			if err != nil {
				log.Fatalf("logging.Setup err: %v", err)
			}

			logger = log.New(F, DefaultPrefix, log.LstdFlags)
			gin.DefaultWriter = io.MultiWriter(F, os.Stdout)
		}
	}
	}()


	//// gin log设置
	//gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
	//
	//	// 你的自定义格式
	//	return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"%s\n",
	//		param.ClientIP,
	//		param.TimeStamp.Format(time.RFC1123),
	//		param.Method,
	//		param.Path,
	//		param.Request.Proto,
	//		param.StatusCode,
	//		param.Latency,
	//		param.Request.UserAgent(),
	//		param.ErrorMessage,
	//		param.Request.Form,
	//	)
	//})



}

func Debug(v ...interface{}) {
	setPrefix(DEBUG)
	logger.Println(v)
}

func Info(v ...interface{}) {
	setPrefix(INFO)
	logger.Println(v)
}

func Warn(v ...interface{}) {
	setPrefix(WARNING)
	logger.Println(v)
}

func Error(v ...interface{}) {
	setPrefix(ERROR)
	logger.Println(v)
}

func Fatal(v ...interface{}) {
	setPrefix(FATAL)
	logger.Fatalln(v)
}

func setPrefix(level Level) {
	_, file, line, ok := runtime.Caller(DefaultCallerDepth)
	if ok {
		logPrefix = fmt.Sprintf("[%s][%s:%d]", levelFlags[level], filepath.Base(file), line)
	} else {
		logPrefix = fmt.Sprintf("[%s]", levelFlags[level])
	}

	logger.SetPrefix(logPrefix)
}