package middlewares

import (
	"context"
	"github.com/getsentry/sentry-go"
	sentryhttp "github.com/getsentry/sentry-go/http"
	"net/http"
)

// SentryMiddleware is a wrapper around sentryhttp to include user information to traces
type SentryMiddleware struct {
	handler http.Handler
}

func NewSentryMiddleware() func(http.Handler) http.Handler {
	return func(h http.Handler) http.Handler {
		return sentryhttp.New(sentryhttp.Options{
			Repanic: true,
		}).Handle(&SentryMiddleware{handler: h})
	}
}

func (h *SentryMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	ctx := context.WithValue(r.Context(), "-", "-")
	h.handler.ServeHTTP(w, r.WithContext(ctx))
	if hub := sentry.GetHubFromContext(ctx); hub != nil {
		if user := GetPrincipal(r); user != nil {
			hub.Scope().SetUser(sentry.User{ID: user.ID})
		}
	}
}