package telemetry

import (
	"fmt"
	"log/slog"
	"runtime/debug"
)

// RecordError logs an error with consistent structured fields for operations dashboards.
func RecordError(logger *slog.Logger, err error, msg string, attrs ...any) {
	if logger == nil || err == nil {
		return
	}
	args := append([]any{
		"error", err.Error(),
		"error_kind", fmt.Sprintf("%T", err),
	}, attrs...)
	logger.Error(msg, args...)
}

// RecordPanic logs a recovered panic with stack trace.
func RecordPanic(logger *slog.Logger, component string, recovered any) {
	if logger == nil {
		return
	}
	logger.Error("panic recovered",
		"component", component,
		"panic", fmt.Sprint(recovered),
		"stack", string(debug.Stack()),
	)
}

// RecoverPanic should be deferred in long-running goroutines.
func RecoverPanic(logger *slog.Logger, component string) {
	if recovered := recover(); recovered != nil {
		RecordPanic(logger, component, recovered)
	}
}
