package logger

import (
	"context"
	"fmt"
	"net/http"

	"github.com/rs/zerolog/log"
	"go.opentelemetry.io/otel/trace"

	"gitlab.golang-school.ru/potok-2/lessons/lesson-24/pkg/router"
)

type ContextErrKey struct{}

func Middleware(next http.Handler) http.Handler {
	fn := func(w http.ResponseWriter, r *http.Request) {
		var err error
		ctx := context.WithValue(r.Context(), ContextErrKey{}, &err)

		ww := router.WriterWrapper(w)
		next.ServeHTTP(ww, r.WithContext(ctx))

		event := log.Info()

		if err != nil {
			event = log.Error().Err(err)
		}

		event.
			Int("code", ww.Code()).
			Str("method", fmt.Sprintf("%s %s", r.Method, router.ExtractPath(r.Context()))).
			Str("trace_id", trace.SpanContextFromContext(r.Context()).TraceID().String()).
			Send()
	}

	return http.HandlerFunc(fn)
}
