package im

import (
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/api/testkit/httputil"
)

func TestRegisterRoutesMountsWorkspacePrefixedIMHTTPRoutes(t *testing.T) {
	router := gin.New()
	RegisterRoutes(router, Dependencies{})

	routes := httputil.RouteCounts(router)
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/snapshot"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/scopes/:scopeId/snapshot"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/dm-channels"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/dm-channels"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/dm-channels/:channelId"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/messages/search"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/messages/:messageId/delivery"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/messages/:messageId/agent-delivery"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/messages/:messageId/rewind"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/recall"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/owner-context-dismiss"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/scopes/:scopeId/notifications"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/notifications/self"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/notifications/agents/:agentId"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/scopes/:scopeId/notifications/agents/all"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/conversations"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/conversations/actions"])
	require.Equal(t, 1, routes["POST /api/v1/workspaces/:workspaceId/conversations/:conversationId/actions"])
	require.Equal(t, 1, routes["PUT /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/reactions/:emoji"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/scopes/:scopeId/pins"])
	require.Equal(t, 1, routes["PUT /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/pin"])
	require.Equal(t, 1, routes["DELETE /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/pin"])
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/scopes/:scopeId/top-notice"])
	require.Equal(t, 1, routes["PUT /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/top-notice"])
	require.Equal(t, 1, routes["DELETE /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/top-notice"])
	require.Equal(t, 1, routes["PUT /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/top-notice/banner-hide"])
	require.Equal(t, 1, routes["DELETE /api/v1/workspaces/:workspaceId/scopes/:scopeId/messages/:messageId/top-notice/banner-hide"])
	require.Equal(t, 1, routes["DELETE /api/v1/workspaces/:workspaceId/scopes/:scopeId/top-notice-hides"])
}

func TestRegisterWebSocketRoutesMountsOnlyWorkspaceIMStream(t *testing.T) {
	router := gin.New()
	RegisterWebSocketRoutes(router, Dependencies{})

	routes := httputil.RouteCounts(router)
	require.Equal(t, 1, routes["GET /api/v1/workspaces/:workspaceId/events/stream"])
	require.Zero(t, routes["GET /api/v1/workspaces/:workspaceId/events/resume"])
	require.Zero(t, routes["POST /api/v1/workspaces/:workspaceId/events/ack"])
}
