// Package logger wraps *slog.Logger with a request-ID-aware helper.
package logger

import (
	"context"
	"log/slog"
	"os"
	"strings"
)

type ctxKey struct{}

// New returns a structured slog handler. level is one of debug|info|warn|error.
func New(level string) *slog.Logger {
	var lvl slog.Level
	switch strings.ToLower(level) {
	case "debug":
		lvl = slog.LevelDebug
	case "warn":
		lvl = slog.LevelWarn
	case "error":
		lvl = slog.LevelError
	default:
		lvl = slog.LevelInfo
	}
	h := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
		Level: lvl,
	})
	return slog.New(h)
}

// WithRequestID attaches a request ID to the logger instance.
func WithRequestID(parent *slog.Logger, requestID string) *slog.Logger {
	return parent.With("request_id", requestID)
}

// WithUserID attaches the acting user ID for audit/context logging.
func WithUserID(parent *slog.Logger, userID int64) *slog.Logger {
	return parent.With("user_id", userID)
}

// FromContext returns the logger stored in ctx, or a default logger if absent.
func FromContext(ctx context.Context) *slog.Logger {
	if l, ok := ctx.Value(ctxKey{}).(*slog.Logger); ok && l != nil {
		return l
	}
	return slog.Default()
}

// ToContext stores a logger (typically request-scoped) in ctx.
func ToContext(ctx context.Context, l *slog.Logger) context.Context {
	return context.WithValue(ctx, ctxKey{}, l)
}
