package middleware

import (
	"os"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/kernel/pkg/perftiming"
)

const (
	perfTimingHeaderEnabledEnv = "NEXUSCRM_PERF_TIMING_HEADER_ENABLED"
	perfTimingHeaderName       = "X-NexusCRM-Perf-Timing"
)

func PerfTimingFromEnv() gin.HandlerFunc {
	if !truthyEnv(os.Getenv(perfTimingHeaderEnabledEnv)) {
		return nil
	}
	return NewPerfTimingHeader()
}

func NewPerfTimingHeader() gin.HandlerFunc {
	return func(c *gin.Context) {
		if c != nil && c.Request != nil && perfTimingHeaderRequested(c) {
			c.Request = c.Request.WithContext(perftiming.WithEnabled(c.Request.Context()))
		}
		c.Next()
	}
}

func perfTimingHeaderRequested(c *gin.Context) bool {
	if c == nil || c.Request == nil {
		return false
	}
	return truthyEnv(c.GetHeader(perfTimingHeaderName))
}

func truthyEnv(raw string) bool {
	switch strings.ToLower(strings.TrimSpace(raw)) {
	case "1", "true", "t", "yes", "y", "on":
		return true
	default:
		return false
	}
}
