package webagent

import (
	"encoding/json"
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"

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

func TestTrajectoryHandler(t *testing.T) {
	t.Run("view-only agent access is denied before runtime history", func(t *testing.T) {
		fake := newFakeStore()
		fake.getAgentErr = api.ErrForbidden
		runtime := &fakeRuntime{}
		router := newWebAgentRouter(Dependencies{AgentStore: fake, Runtime: runtime})

		resp := httputil.DoJSON(t, router, http.MethodGet, "/api/v1/workspaces/wsp_1/agents/agt_1/trajectory", nil)
		require.Equal(t, http.StatusForbidden, resp.Code)
		require.Equal(t, trajectoryCall{}, runtime.lastTrajectory)
	})

	t.Run("offline machine returns empty history", func(t *testing.T) {
		fake := newFakeStore()
		runtime := &fakeRuntime{trajectoryErr: runtimecontrol.ErrMachineOffline}
		router := newWebAgentRouter(Dependencies{AgentStore: fake, Runtime: runtime})

		resp := httputil.DoJSON(t, router, http.MethodGet, "/api/v1/workspaces/wsp_1/agents/agt_1/trajectory?limit=80", nil)
		require.Equal(t, http.StatusOK, resp.Code)
		require.Equal(t, trajectoryCall{MachineID: "mach_1", AgentID: "agt_1", Limit: 80}, runtime.lastTrajectory)
		require.Equal(t, runtimecontrol.RemoteRequestOriginUserInteractive, runtime.lastRemoteRequest.Origin)
		require.Equal(t, runtimecontrol.RemoteRequestCauseWebAPI, runtime.lastRemoteRequest.Cause)

		var out []any
		require.NoError(t, json.Unmarshal(resp.Body.Bytes(), &out))
		require.Empty(t, out)
	})
}
