package middleware

import (
	"net/http"

	"github.com/opencloud-eu/opencloud/pkg/log"
)

// ContextLogger is a middleware to use a logger associated with the request's
// context which includes general information of the request.
func ContextLogger(logger log.Logger) func(http.Handler) http.Handler {
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			ctx := logger.With().
				Str("remoteAddr", r.RemoteAddr).
				Str(log.RequestIDString, r.Header.Get("X-Request-ID")).
				Str("proto", r.Proto).
				Str("method", r.Method).
				Str("path", r.URL.Path).
				Str("query", r.URL.RawQuery).
				Str("fragment", r.URL.Fragment).
				Logger().WithContext(r.Context())
			next.ServeHTTP(w, r.WithContext(ctx))
		})
	}
}
