package runtimecontrol

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestRemoteRequestContextDefaultsToBackground(t *testing.T) {
	t.Parallel()

	for _, ctx := range []context.Context{nil, context.Background()} {
		request := RemoteRequestContextFromContext(ctx)
		require.Equal(t, RemoteRequestOriginBackground, request.Origin)
		require.Equal(t, RemoteRequestCauseUnknown, request.Cause)
	}
}

func TestRemoteRequestContextStoresUserAndSystemOrigins(t *testing.T) {
	t.Parallel()

	userCtx := WithRemoteRequestContext(context.Background(), RemoteRequestContext{Origin: RemoteRequestOriginUserInteractive, Cause: RemoteRequestCauseWebAPI})
	userRequest := RemoteRequestContextFromContext(userCtx)
	require.Equal(t, RemoteRequestOriginUserInteractive, userRequest.Origin)
	require.Equal(t, RemoteRequestCauseWebAPI, userRequest.Cause)

	systemCtx := WithRemoteRequestContext(context.Background(), RemoteRequestContext{Origin: RemoteRequestOriginSystemInternal, Cause: RemoteRequestCauseServiceAgentTeam})
	systemRequest := RemoteRequestContextFromContext(systemCtx)
	require.Equal(t, RemoteRequestOriginSystemInternal, systemRequest.Origin)
	require.Equal(t, RemoteRequestCauseServiceAgentTeam, systemRequest.Cause)
}

func TestRemoteRequestContextNormalizesLowCardinalityCause(t *testing.T) {
	t.Parallel()

	ctx := WithRemoteRequestContext(context.Background(), RemoteRequestContext{
		Origin: RemoteRequestOriginUserInteractive,
		Cause:  "user_123/repo/path",
	})
	request := RemoteRequestContextFromContext(ctx)
	require.Equal(t, RemoteRequestOriginUserInteractive, request.Origin)
	require.Equal(t, RemoteRequestCauseUnknown, request.Cause)
}

func TestRemoteRequestContextNormalizesUnknownOriginToBackground(t *testing.T) {
	t.Parallel()

	ctx := WithRemoteRequestContext(context.Background(), RemoteRequestContext{
		Origin: RemoteRequestOrigin("mobile_tap"),
		Cause:  RemoteRequestCauseWebAPI,
	})
	request := RemoteRequestContextFromContext(ctx)
	require.Equal(t, RemoteRequestOriginBackground, request.Origin)
	require.Equal(t, RemoteRequestCauseWebAPI, request.Cause)
}

func TestRemoteRequestContextIsContextScoped(t *testing.T) {
	t.Parallel()

	marked := WithRemoteRequestContext(context.Background(), RemoteRequestContext{Origin: RemoteRequestOriginUserInteractive, Cause: RemoteRequestCauseWebAPI})
	require.Equal(t, RemoteRequestOriginUserInteractive, RemoteRequestContextFromContext(marked).Origin)

	// A fresh async/service-agentteam context has no global marker. Background work
	// must explicitly opt in rather than inheriting user-active state by accident.
	request := RemoteRequestContextFromContext(context.Background())
	require.Equal(t, RemoteRequestOriginBackground, request.Origin)
	require.Equal(t, RemoteRequestCauseUnknown, request.Cause)
}
