package appctx

import (
	"context"
	"strings"

	"wucher/internal/shared/pkg/uuidv7"
)

type contextKey string

const userIDKey contextKey = "appctx-user-id"

func WithUserID(ctx context.Context, userID []byte) context.Context {
	if len(userID) == 0 {
		return ctx
	}

	copyID := make([]byte, len(userID))
	copy(copyID, userID)
	return context.WithValue(ctx, userIDKey, copyID)
}

func GetUserID(ctx context.Context) []byte {
	if ctx == nil {
		return nil
	}

	raw := ctx.Value(userIDKey)
	if raw == nil {
		if getter, ok := any(ctx).(interface{ UserValue(any) any }); ok {
			raw = getter.UserValue("user_id")
		}
	}

	switch v := raw.(type) {
	case []byte:
		if len(v) == 0 {
			return nil
		}
		out := make([]byte, len(v))
		copy(out, v)
		return out
	case string:
		s := strings.TrimSpace(v)
		if s == "" {
			return nil
		}
		id, err := uuidv7.ParseString(s)
		if err != nil {
			return nil
		}
		return id
	default:
		return nil
	}
}
