package appctx

import (
	"context"
	"testing"

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

func TestWithUserIDAndGetUserID(t *testing.T) {
	id, err := uuidv7.ParseString("00000000-0000-0000-0000-000000000001")
	if err != nil {
		t.Fatal(err)
	}

	ctx := WithUserID(context.Background(), id)
	got := GetUserID(ctx)
	if len(got) != len(id) {
		t.Fatalf("expected %d bytes, got %d", len(id), len(got))
	}
	if string(got) != string(id) {
		t.Fatalf("expected %x, got %x", id, got)
	}

	got[0] ^= 0xff
	if string(GetUserID(ctx)) == string(got) {
		t.Fatal("GetUserID returned a reference to internal data")
	}
}

func TestGetUserIDFromLegacyContext(t *testing.T) {
	ctx := &legacyContext{Context: context.Background(), userID: []byte("legacy")}
	got := GetUserID(ctx)
	if string(got) != "legacy" {
		t.Fatalf("expected legacy user id, got %s", got)
	}
}

type legacyContext struct {
	context.Context
	userID []byte
}

func (c *legacyContext) UserValue(_ any) any {
	return c.userID
}
