// модуль создания единого логирования

package logger

import (
	"os"
	"path"
	"runtime"
	"strconv"
	"sync"

	//"github.com/google/logger"
	//"github.com/sirupsen/logrus"
	logrus "github.com/ManyakRus/logrus"

	"github.com/ManyakRus/starter/micro"
)

// log - глобальный логгер приложения
var log *logrus.Logger

// onceLog - гарантирует единственное создание логгера
var onceLog sync.Once

// GetLog - возвращает глобальный логгер приложения
// и создаёт логгер если ещё не создан
func GetLog() *logrus.Logger {
	onceLog.Do(func() {

		log = logrus.New()
		log.SetReportCaller(true)

		Formatter := new(logrus.TextFormatter)
		Formatter.TimestampFormat = "2006-01-02 15:04:05.000"
		Formatter.FullTimestamp = true
		Formatter.CallerPrettyfier = CallerPrettyfier
		log.SetFormatter(Formatter)

		LOG_LEVEL := os.Getenv("LOG_LEVEL")
		SetLevel(LOG_LEVEL)

		//LOG_FILE := "log.txt"
		//file, err := os.OpenFile(LOG_FILE, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0755)
		//if err != nil {
		//	log.Fatal(err)
		//}
		////defer file.Close()
		//
		//mw := io.MultiWriter(os.Stderr, file)
		//logrus.SetOutput(mw)

		//log.SetOutput(os.Stdout)
		//log.SetOutput(file)

	})

	return log
}

// CallerPrettyfier - форматирует имя файла и номер строки кода
func CallerPrettyfier(frame *runtime.Frame) (function string, file string) {
	fileName := " " + path.Base(frame.File) + ":" + strconv.Itoa(frame.Line) + "\t"
	FunctionName := frame.Function
	FunctionName = micro.LastWord(FunctionName)
	FunctionName = FunctionName + "()" + "\t"
	return FunctionName, fileName
}

// SetLevel - изменяет уровень логирования
func SetLevel(LOG_LEVEL string) {
	if log == nil {
		GetLog()
	}

	if LOG_LEVEL == "" {
		LOG_LEVEL = "debug"
	}
	level, err := logrus.ParseLevel(LOG_LEVEL)
	if err != nil {
		log.Error("logrus.ParseLevel() error: ", err)
	}

	if level == log.Level {
		return
	}

	log.SetLevel(level)
	log.Debug("new level: ", LOG_LEVEL)
}
