package exec

import (
	"context"
	"encoding/json"
	"io"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/wire/apiclient"
)

func TestWorkspaceHandlerReturnsTypedResult(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, _ = io.WriteString(w, `{"channels":[{"name":"general","displayName":"General"}]}`)
	}))
	t.Cleanup(server.Close)

	result, err := (workspaceHandler{}).list(context.Background(), actionScopedJSON[workspaceListRequest]{
		Authorized: runtimeAuthorization{Server: &apiclient.Client{
			ServerURL: server.URL, RouteWorkspaceID: "ws", AgentID: "ag", AuthToken: "token", HTTPClient: server.Client(),
		}},
	})
	require.NoError(t, err)
	require.Equal(t, "general", result.Data.Channels[0].Name)
	require.NotNil(t, result.Data.Agents)
	require.NotNil(t, result.Data.Humans)
}

func TestWorkspaceOutputSchemaUsesPagination(t *testing.T) {
	descriptor, err := describe(workspaceListSpec)
	require.NoError(t, err)
	require.Contains(t, string(descriptor.OutputSchema), `"hasMore"`)
	require.Contains(t, string(descriptor.OutputSchema), `"nextCursor"`)
	require.NotContains(t, string(descriptor.OutputSchema), `"has_more"`)
	require.NotContains(t, string(descriptor.OutputSchema), `"next_cursor"`)

	schema := mustCompile(t, descriptor.InputSchema)
	require.NoError(t, validateInstance(schema, json.RawMessage(`{"limit":100}`)))
	require.Error(t, validateInstance(schema, json.RawMessage(`{"limit":0}`)))
	require.Error(t, validateInstance(schema, json.RawMessage(`{"limit":101}`)))
}
