package logging

import (
	"os"

	"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
}

// 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 := 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.DarkGray}
			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{}
	})
	base = log.NewSyncLogger(base)

	return level.Debug(base), level.Info(base), level.Warn(base), level.Error(base)
}