package pulseradar

import (
	"context"
	"log/slog"
)

// SlogHandler is a slog.Handler that sends logs to PulseRadar.
type SlogHandler struct {
	client *Client
	attrs  []slog.Attr
	group  string
}

// NewSlogHandler creates a slog.Handler backed by a PulseRadar client.
func NewSlogHandler(client *Client) *SlogHandler {
	return &SlogHandler{client: client}
}

func (h *SlogHandler) Enabled(_ context.Context, _ slog.Level) bool { return true }

func (h *SlogHandler) Handle(_ context.Context, r slog.Record) error {
	level := "info"
	switch {
	case r.Level >= slog.LevelError:
		level = "error"
	case r.Level >= slog.LevelWarn:
		level = "warning"
	case r.Level >= slog.LevelInfo:
		level = "info"
	default:
		level = "debug"
	}

	var fields []Field
	for _, a := range h.attrs {
		fields = append(fields, F(a.Key, a.Value.String()))
	}
	r.Attrs(func(a slog.Attr) bool {
		key := a.Key
		if h.group != "" {
			key = h.group + "." + key
		}
		fields = append(fields, F(key, a.Value.String()))
		return true
	})

	h.client.log(level, r.Message, fields)
	return nil
}

func (h *SlogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
	return &SlogHandler{client: h.client, attrs: append(h.attrs, attrs...), group: h.group}
}

func (h *SlogHandler) WithGroup(name string) slog.Handler {
	g := name
	if h.group != "" {
		g = h.group + "." + name
	}
	return &SlogHandler{client: h.client, attrs: h.attrs, group: g}
}
