package log

import "strings"

const (
	TraceLevel int = iota + 1
	DebugLevel
	InfoLevel
	WarnLevel
	ErrorLevel
	FatalLevel
	PanicLevel
)

var (
	lvText = map[int]string{
		TraceLevel: "TRACE",
		DebugLevel: "DEBUG",
		InfoLevel:  "INFO",
		WarnLevel:  "WARN",
		ErrorLevel: "ERROR",
		FatalLevel: "FATAL",
		PanicLevel: "PANIC",
	}
)

type Logger interface {
	SetLevel(int)
	Prefix(string)
	Print(i ...interface{})
	Printf(format string, args ...interface{})
	Debug(i ...interface{})
	Debugf(format string, args ...interface{})
	Info(i ...interface{})
	Infof(format string, args ...interface{})
	Warn(i ...interface{})
	Warnf(format string, args ...interface{})
	Error(i ...interface{})
	Errorf(format string, args ...interface{})
	Fatal(i ...interface{})
	Fatalf(format string, args ...interface{})
	Panic(i ...interface{})
	Panicf(format string, args ...interface{})
}

func getLevelText(lv int) string {
	if s, ok := lvText[lv]; ok {
		return s
	} else {
		return "TRACE"
	}
}

func ParseLevel(s string) (lv int) {
	lv = DebugLevel
	s = strings.ToUpper(s)
	for k, v := range lvText {
		if s == v {
			lv = k
			return
		}
	}
	return
}

func ParseLevelWithoutDefault(s string) (lv int) {
	lv = -1
	s = strings.ToUpper(s)
	for k, v := range lvText {
		if s == v {
			lv = k
			return
		}
	}
	return
}
