package logging

import (
	"os"
	"sync"

	"github.com/go-kit/log"
	"github.com/go-kit/log/level"
	"github.com/go-kit/log/term"
)

// Logger records log lines to an output.
type Logger interface {
	Log(keyvals ...any) error
}

var (
	once       sync.Once
	baselogger Logger
)

func Base() Logger {
	once.Do(func() {
		base := term.NewLogger(os.Stdout, log.NewLogfmtLogger, func(keyvals ...any) term.FgBgColor {
			for i := 0; i < len(keyvals)-1; i += 2 {
				if keyvals[i] != "level" {
					continue
				}

				switch keyvals[i+1] {
				case level.DebugValue():
					return term.FgBgColor{Fg: term.Gray}
				case level.InfoValue():
					return term.FgBgColor{Fg: term.Green}
				case level.WarnValue():
					return term.FgBgColor{Fg: term.Yellow}
				case level.ErrorValue():
					return term.FgBgColor{Fg: term.Red}
				}
			}

			return term.FgBgColor{}
		})
		baselogger = log.NewSyncLogger(base)
	})
	return baselogger
}

// DefaultLoggers produces helpful base loggers for each level.
//
// They write logfmt to standard out, annotated with ANSI colors depending on the level.
func DefaultLoggers() (debug, info, warn, error Logger) {
	base := Base()
	return level.Debug(base), level.Info(base), level.Warn(base), level.Error(base)
}