package handler

import (
	"context"
	"net/http"

	"github.com/AlchemyTelcoSolutions/xutils-go/xlogger"
	"github.com/google/uuid"
)

type ContextKey string

const correlationID = ContextKey(CorrelationID)
const tracingLoggerKey = "tracing-logger"

// Context gets a new context with xloggerRequest for distributed tracing
func setContext(r *http.Request, logger xlogger.Logger) context.Context {
	ctx := context.WithValue(r.Context(), tracingLoggerKey, New(logger, r))
	ctx = context.WithValue(ctx, correlationID, r.Header.Get(CorrelationID))
	return ctx
}

const CorrelationID string = "Correlation-ID"

type xloggerRequest struct {
	logger xlogger.Logger
	// gateway trace id header
	correlationID *string
}

func New(logger xlogger.Logger, r *http.Request) xlogger.Logger {
	var correlationID *string
	correlationIDHeader := r.Header.Get(CorrelationID)

	if correlationIDHeader != "" {
		correlationID = &correlationIDHeader
	} else {
		newID := uuid.New().String()
		correlationID = &newID
	}
	return &xloggerRequest{
		logger:        logger,
		correlationID: correlationID,
	}
}
