package financialmodelingprep

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/extension/runner"
	"github.com/tidbcloud/AgentTeam/internal/extension/spec"
)

const schemaDialect = "https://json-schema.org/draft/2020-12/schema"

// The dispatch table must serve exactly the cataloged 37 actions, every
// action must be read-classified, and every schema root must carry the
// dialect.
func TestHandlersMatchCatalog(t *testing.T) {
	definition := Definition()
	handlers := Handlers()

	require.Len(t, definition.Actions, 37)
	require.Len(t, handlers, 37)
	for _, action := range definition.Actions {
		_, served := handlers[action.Name]
		require.True(t, served, "action %q is not served by the handler table", action.Name)
		require.Equal(t, spec.Safety{Class: "read", Idempotent: true, Destructive: false}, action.Safety)
		require.Equal(t, schemaDialect, action.InputSchema["$schema"])
		require.Equal(t, schemaDialect, action.OutputSchema["$schema"])
		require.NotEmpty(t, action.Summary)
		require.NotEmpty(t, action.Description)
	}
	for name := range handlers {
		found := false
		for _, action := range definition.Actions {
			if action.Name == name {
				found = true
				break
			}
		}
		require.True(t, found, "handler %q is not cataloged", name)
	}
}

// The AuthSpec must collect exactly one secret field injected as the apikey
// query parameter by the runtime.
func TestAuthSpecShape(t *testing.T) {
	auth := AuthSpec()
	require.Equal(t, runner.AuthQuery, auth.Kind)
	require.Equal(t, "apikey", auth.QueryName)
	require.Len(t, auth.Fields, 1)
	field := auth.Fields[0]
	require.Equal(t, APIKeyField, field.Name)
	require.True(t, field.Required)
	require.True(t, field.Secret)
	require.Empty(t, field.HeaderName)
}
