package webagent

import (
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"

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

func TestWorkspaceFileHandlers(t *testing.T) {
	content := "hello"
	fake := newFakeStore()
	runtime := &fakeRuntime{
		workspacePage:    &agent.WorkspaceFilePage{Files: []agent.WorkspaceFile{{Name: "README.md", Path: "README.md"}}, Limit: 2, Cursor: "4", HasMore: true, NextCursor: "6"},
		workspaceContent: agent.WorkspaceFileContent{Content: &content},
	}
	router := newWebAgentRouter(Dependencies{AgentStore: fake, ReviewStore: fake, Runtime: runtime})

	resp := httputil.DoJSON(t, router, http.MethodGet, "/api/v1/workspaces/wsp_1/agents/agt_1/files?dirPath=docs&limit=2&cursor=4", nil)
	require.Equal(t, http.StatusOK, resp.Code)
	require.Equal(t, "docs", runtime.lastWorkspaceDir)
	require.Equal(t, agent.WorkspaceListOptions{Limit: 2, Cursor: "4"}, runtime.lastWorkspaceOpts)
	require.Equal(t, runtimecontrol.RemoteRequestOriginUserInteractive, runtime.lastRemoteRequest.Origin)
	require.Equal(t, runtimecontrol.RemoteRequestCauseWebAPI, runtime.lastRemoteRequest.Cause)
	require.Contains(t, resp.Body.String(), "README.md")
	require.Contains(t, resp.Body.String(), `"hasMore":true`)
	require.Contains(t, resp.Body.String(), `"nextCursor":"6"`)

	resp = httputil.DoJSON(t, router, http.MethodGet, "/api/v1/workspaces/wsp_1/agents/agt_1/files/content?path=README.md", nil)
	require.Equal(t, http.StatusOK, resp.Code)
	require.Equal(t, "README.md", runtime.lastWorkspaceRead)
	require.Equal(t, runtimecontrol.RemoteRequestOriginUserInteractive, runtime.lastRemoteRequest.Origin)
	require.Equal(t, runtimecontrol.RemoteRequestCauseWebAPI, runtime.lastRemoteRequest.Cause)
	require.Contains(t, resp.Body.String(), "hello")

	resp = httputil.DoJSON(t, router, http.MethodGet, "/api/v1/workspaces/wsp_1/agents/agt_1/files/content", nil)
	require.Equal(t, http.StatusBadRequest, resp.Code)
}
