package router

import (
	"context"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"

	"github.com/tidbcloud/AgentTeam/internal/observability/logging"
)

func requestIDMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		requestID := requestIDFromHeader(ctx.GetHeader("X-Request-ID"))
		if requestID == "" {
			requestID = uuid.NewString()
		}
		ctx.Header("X-Request-ID", requestID)
		if ctx.Request != nil {
			ctx.Request = ctx.Request.WithContext(
				logging.WithRequestID(ctx.Request.Context(), requestID),
			)
		}
		ctx.Next()
	}
}

func requestIDFromHeader(value string) string {
	trimmed := strings.TrimSpace(value)
	if !isValidRequestID(trimmed) {
		return ""
	}
	return trimmed
}

func isValidRequestID(value string) bool {
	if len(value) == 0 || len(value) > 128 {
		return false
	}
	for _, char := range value {
		switch {
		case char >= 'a' && char <= 'z':
		case char >= 'A' && char <= 'Z':
		case char >= '0' && char <= '9':
		case char == '-' || char == '_':
		default:
			return false
		}
	}
	return true
}

func requestContext(ctx *gin.Context) context.Context {
	if ctx != nil && ctx.Request != nil && ctx.Request.Context() != nil {
		return ctx.Request.Context()
	}
	return context.Background()
}
