package mru

import (
	"context"
	"testing"
	"time"

	"github.com/nexuscrm/kernel/pkg/ports"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

type contractActivityContextKey struct{}

func TestContractActivityTrackRecordAccessPreservesAsyncSafeContextValues(t *testing.T) {
	repo := &contextCaptureMRURepository{
		recentCtxValues: make(chan contractActivityContextProbe, 1),
	}
	activity := NewContractActivity(NewService(repo))

	ctx := context.WithValue(context.Background(), contractActivityContextKey{}, "request-context-value")
	ctx = context.WithValue(ctx, constants.ContextKeyTraceparent, "00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01")
	ctx = context.WithValue(ctx, constants.ContextKeyRequestID, "req-123")
	activity.TrackRecordAccess(ctx, "005-user", "Account", "001-record")

	select {
	case got := <-repo.recentCtxValues:
		if got.value != nil {
			t.Fatalf("context leaked unsafe value = %v, want nil", got.value)
		}
		if got.traceparent != "00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01" {
			t.Fatalf("traceparent = %v, want parent traceparent", got.traceparent)
		}
		if got.requestID != "req-123" {
			t.Fatalf("request_id = %v, want parent request ID", got.requestID)
		}
	case <-time.After(time.Second):
		t.Fatal("timed out waiting for async MRU write")
	}
}

type contractActivityContextProbe struct {
	value       interface{}
	traceparent interface{}
	requestID   interface{}
}

type contextCaptureMRURepository struct {
	recentCtxValues chan contractActivityContextProbe
}

func (r *contextCaptureMRURepository) TrackObjectInteraction(context.Context, string, string) error {
	return nil
}

func (r *contextCaptureMRURepository) GetScopeOrder(context.Context, string) ([]ports.MRUObjectInteraction, error) {
	return nil, nil
}

func (r *contextCaptureMRURepository) SetObjectPinned(context.Context, string, string, bool) error {
	return nil
}

func (r *contextCaptureMRURepository) TrackRecentItem(ctx context.Context, _, _, _ string) error {
	r.recentCtxValues <- contractActivityContextProbe{
		value:       ctx.Value(contractActivityContextKey{}),
		traceparent: ctx.Value(constants.ContextKeyTraceparent),
		requestID:   ctx.Value(constants.ContextKeyRequestID),
	}
	return nil
}

func (r *contextCaptureMRURepository) GetRelevantItems(context.Context, string, []string, int64) ([]ports.MRURecentItem, int64, error) {
	return nil, 0, nil
}

func (r *contextCaptureMRURepository) GetObjectMeta(context.Context, string) (*models.ObjectMetadata, error) {
	return nil, nil
}

func (r *contextCaptureMRURepository) GetObjectMetaBatch(context.Context, []string) (map[string]*models.ObjectMetadata, error) {
	return nil, nil
}

func (r *contextCaptureMRURepository) GetRecordNamesBatch(context.Context, map[string][]string) (map[string]string, error) {
	return nil, nil
}
