package mcp

import (
	"encoding/json"
	"testing"

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

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

	for _, testCase := range []struct {
		name        string
		payload     string
		wantPresent bool
		wantKnown   bool
	}{
		{
			name:        "json present object",
			payload:     `{"jsonrpc":"2.0","id":1,"result":{"content":[],"structuredContent":{"rows":[]}}}`,
			wantPresent: true,
			wantKnown:   true,
		},
		{
			name:        "json explicit null",
			payload:     `{"jsonrpc":"2.0","id":1,"result":{"content":[],"structuredContent":null}}`,
			wantPresent: true,
			wantKnown:   true,
		},
		{
			name:      "json absent",
			payload:   `{"jsonrpc":"2.0","id":1,"result":{"content":[]}}`,
			wantKnown: true,
		},
		{
			name: "sse absent",
			payload: "event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[]}}` +
				"\n\n",
			wantKnown: true,
		},
		{
			name: "sse explicit null",
			payload: "event: message\r\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[],"structuredContent":null}}` +
				"\r\n\r\n",
			wantPresent: true,
			wantKnown:   true,
		},
		{
			name: "sse ignores absent decoy before matching null",
			payload: "event: message\n" +
				`data: {"jsonrpc":"2.0","id":999,"result":{"content":[]}}` +
				"\n\n" +
				"event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[],"structuredContent":null}}` +
				"\n\n",
			wantPresent: true,
			wantKnown:   true,
		},
		{
			name: "sse ignores present decoy before matching absent",
			payload: "event: message\n" +
				`data: {"jsonrpc":"2.0","id":999,"result":{"content":[],"structuredContent":null}}` +
				"\n\n" +
				"event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[]}}` +
				"\n\n",
			wantKnown: true,
		},
		{
			name: "sse duplicate matching responses are ambiguous",
			payload: "event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[]}}` +
				"\n\n" +
				"event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[]}}` +
				"\n\n",
		},
		{
			name: "sse malformed event is ambiguous",
			payload: "event: message\n" +
				"data: {malformed\n\n" +
				"event: message\n" +
				`data: {"jsonrpc":"2.0","id":1,"result":{"content":[]}}` +
				"\n\n",
		},
		{
			name: "sse without matching response is unknown",
			payload: "event: message\n" +
				`data: {"jsonrpc":"2.0","id":999,"result":{"content":[]}}` +
				"\n\n",
		},
		{
			name:    "malformed",
			payload: `{"jsonrpc":`,
		},
	} {
		testCase := testCase
		t.Run(testCase.name, func(t *testing.T) {
			t.Parallel()
			present, known := toolStructuredContentPresence(
				[]byte(testCase.payload),
				json.RawMessage("1"),
			)
			require.Equal(t, testCase.wantKnown, known)
			require.Equal(t, testCase.wantPresent, present)
		})
	}
}
