// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package routing

import (
	"context"
	"net/http"
	"sync/atomic"
	"time"

	"gitea.dev/modules/log"
	"gitea.dev/modules/setting"
)

// NewRequestInfoHandler is a handler that saves request info into request context.
// If router logger is enabled, it will also print request logs and detect slow requests.
func NewRequestInfoHandler() func(next http.Handler) http.Handler {
	var reqLogger *loggerRequestManager
	if setting.IsRouteLogEnabled() {
		reqLogger = &loggerRequestManager{
			logPrint: logPrinter(log.GetLogger("router")),
		}
		reqLogger.startSlowQueryDetector(3 * time.Second)
	}
	var requestCounter atomic.Uint64
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
			record := &requestRecord{
				index:      requestCounter.Add(1),
				startTime:  time.Now(),
				respWriter: w,
			}
			req = req.WithContext(context.WithValue(req.Context(), contextKey, record))
			record.request = req
			if reqLogger != nil {
				end := reqLogger.handleRequestRecord(record)
				defer end()
			}
			next.ServeHTTP(w, req)
		})
	}
}
