package tushare

import (
	"slices"
	"testing"

	"github.com/stretchr/testify/require"

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

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

	collected := make([]string, 0, len(definition.Actions))
	for _, action := range definition.Actions {
		collected = append(collected, action.Name)
		_, 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.Contains(t, action.InputSchema, "$schema")
		require.Contains(t, action.OutputSchema, "$schema")
	}
	for name := range handlers {
		require.Contains(t, collected, name, "handler %q is not cataloged", name)
	}
	require.Equal(t, []string{
		"list-stocks", "get-trade-calendar", "get-daily-quotes",
		"get-daily-basic", "get-adjustment-factors", "get-shareholder-trades",
	}, slices.Clone(collected))
	require.Equal(t, 6, len(handlers))
}

func TestDefinitionIdentity(t *testing.T) {
	definition := Definition()
	require.Equal(t, Domain, definition.Domain)
	require.Equal(t, 1, definition.Version)
	require.NotEmpty(t, definition.Name)
	require.NotEmpty(t, definition.Description)
	require.Len(t, definition.Actions, 6)
}

// The AuthSpec must collect exactly one secret field: the handlers inject
// the token into the request body and the runtime injects no header.
func TestAuthSpecShape(t *testing.T) {
	auth := AuthSpec()
	require.Equal(t, runner.AuthCredential, auth.Kind)
	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)
}
