package runtime

import (
	"strings"
	"testing"

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

func TestMaaSClientExposesWebToolsOnlyWhenEnabled(t *testing.T) {
	payload, err := inferenceContextPayload(
		InferenceModeExploration,
		"system",
		[]InferenceMessage{{Role: "user", Content: "explore"}},
		true,
	)
	require.NoError(t, err)
	tools := payload["tools"].([]map[string]any)
	names := make([]string, 0, len(tools))
	for _, tool := range tools {
		function := tool["function"].(map[string]any)
		names = append(names, function["name"].(string))
		parameters := function["parameters"].(map[string]any)
		properties := parameters["properties"].(map[string]any)
		switch function["name"] {
		case knowledgeWebSearchFunction:
			require.ElementsMatch(t, []any{"query"}, parameters["required"])
			require.EqualValues(t, maxWebSearchQueryBytes, properties["query"].(map[string]any)["maxLength"])
		case knowledgeWebReadFunction:
			require.ElementsMatch(t, []any{"webRef"}, parameters["required"])
			require.Equal(t, `^w[1-9][0-9]*$`, properties["webRef"].(map[string]any)["pattern"])
		}
	}
	require.Equal(t, []string{
		knowledgeSearchFunction, knowledgeListFunction, knowledgeReadFunction, knowledgeRefFunction,
		knowledgeWebSearchFunction, knowledgeWebReadFunction,
		knowledgeAnswerFunction, knowledgeNoAnswerFunction,
	}, names)

	_, _, err = readMaaSResponse(
		strings.NewReader(validChatCompletion("response_web", "call_web", knowledgeWebSearchFunction, `{"query":"current docs"}`)),
		InferenceModeExploration,
		mustSupportedProfile(t, chatCompletionsProfileOpenAIRequiredToolsV1),
		false,
		false,
	)
	var runtimeErr *Error
	require.ErrorAs(t, err, &runtimeErr)
	require.Equal(t, CodeResponseInvalid, runtimeErr.Code)

	result, _, err := readMaaSResponse(
		strings.NewReader(validChatCompletion("response_web", "call_web", knowledgeWebSearchFunction, `{"query":"current docs"}`)),
		InferenceModeExploration,
		mustSupportedProfile(t, chatCompletionsProfileOpenAIRequiredToolsV1),
		true,
		false,
	)
	require.NoError(t, err)
	require.Equal(t, knowledgeWebSearchFunction, result.Message.ToolCalls[0].Function.Name)
}
