package log

import "golang.org/x/exp/slog"

const (
	LevelTrace slog.Level = -8
	LevelDebug slog.Level = -4
	LevelInfo  slog.Level = 0
	LevelWarn  slog.Level = 4
	LevelError slog.Level = 8

	// LevelDisabled means nothing is ever logged (no call site may use this level).
	LevelDisabled slog.Level = 16
)

// ReplaceLevelAttr rewrites the level attribute to the correct string value.
// This is done because slog doesn't include trace level logging and
// otherwise trace logs show up as `DEBUG-4`.
func ReplaceLevelAttr(groups []string, a slog.Attr) slog.Attr {
	if a.Key != slog.LevelKey {
		return a
	}

	level := a.Value.Any().(slog.Level)
	switch {
	case level < LevelDebug:
		a.Value = slog.StringValue("TRACE")
	case level < LevelInfo:
		a.Value = slog.StringValue("DEBUG")
	case level < LevelWarn:
		a.Value = slog.StringValue("INFO")
	case level < LevelError:
		a.Value = slog.StringValue("WARNING")
	default:
		a.Value = slog.StringValue("ERROR")
	}

	return a
}