package temporal

import (
	"context"
	"log/slog"

	"go.temporal.io/server/common/log"
	"go.temporal.io/server/common/log/tag"
)

type slogLogger struct {
	log   *slog.Logger
	level slog.Level
}

var _ log.Logger = slogLogger{}

func (s slogLogger) Debug(msg string, tags ...tag.Tag) { s.Log(slog.LevelDebug, msg, tags) }
func (s slogLogger) Info(msg string, tags ...tag.Tag)  { s.Log(slog.LevelInfo, msg, tags) }
func (s slogLogger) Warn(msg string, tags ...tag.Tag)  { s.Log(slog.LevelWarn, msg, tags) }
func (s slogLogger) Error(msg string, tags ...tag.Tag) { s.Log(slog.LevelError, msg, tags) }

// Panics and fatals are just errors
func (s slogLogger) DPanic(msg string, tags ...tag.Tag) { s.Log(slog.LevelError, msg, tags) }
func (s slogLogger) Panic(msg string, tags ...tag.Tag)  { s.Log(slog.LevelError, msg, tags) }
func (s slogLogger) Fatal(msg string, tags ...tag.Tag)  { s.Log(slog.LevelError, msg, tags) }

func (s slogLogger) Log(level slog.Level, msg string, tags []tag.Tag) {
	if level >= s.level && s.log.Enabled(context.Background(), level) {
		s.log.LogAttrs(context.Background(), level, msg, logTagsToAttrs(tags)...)
	}
}

func logTagsToAttrs(tags []tag.Tag) []slog.Attr {
	attrs := make([]slog.Attr, len(tags))
	for i, tag := range tags {
		attrs[i] = slog.Any(tag.Key(), tag.Value())
	}
	return attrs
}
