package webagent

import (
	"net/http"
	"net/http/httptest"
	"testing"

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

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/identity"
	"github.com/tidbcloud/AgentTeam/internal/store/model"
	"github.com/tidbcloud/AgentTeam/internal/store/workspace"
)

func TestReviewSnapshotUsesDedicatedRuntimeSnapshot(t *testing.T) {
	store := &fakeStore{review: &agent.ReviewContext{ID: "rcx_1", MachineID: "mach_1", SourceAgentID: "agt_1", RootPath: "/repo"}}
	runtime := &fakeRuntime{snapshot: &agent.AgentReviewSnapshot{
		Summary: agent.AgentReviewSummary{Status: "ready"},
		Files:   []agent.AgentReviewFile{{Path: "main.go"}},
	}}
	handler := &ReviewHandler{reviewStore: store, runtime: runtime}
	request := reviewSnapshotRequest(t)

	response, err := handler.Snapshot(request)
	require.NoError(t, err)
	require.Equal(t, http.StatusOK, response.Status)
	require.Equal(t, "rcx_1", store.lastReviewID)
	require.Empty(t, runtime.lastSummary.TargetPath)
	require.Empty(t, runtime.lastFiles.TargetPath)
}

func TestReviewSnapshotFallsBackToConcurrentLegacyReads(t *testing.T) {
	store := &fakeStore{review: &agent.ReviewContext{ID: "rcx_1", MachineID: "mach_1", SourceAgentID: "agt_1", RootPath: "/repo"}}
	runtime := &fakeRuntime{
		summary:     agent.AgentReviewSummary{Status: "ready"},
		reviewFiles: []agent.AgentReviewFile{{Path: "main.go"}},
	}
	handler := &ReviewHandler{reviewStore: store, runtime: runtime}

	response, err := handler.Snapshot(reviewSnapshotRequest(t))
	require.NoError(t, err)
	require.Equal(t, http.StatusOK, response.Status)
	require.Equal(t, "/repo", runtime.lastSummary.TargetPath)
	require.Equal(t, "/repo", runtime.lastFiles.TargetPath)
}

func reviewSnapshotRequest(t *testing.T) api.WorkspaceScopedRequest {
	t.Helper()
	gin.SetMode(gin.TestMode)
	ctx, _ := gin.CreateTestContext(httptest.NewRecorder())
	ctx.Params = gin.Params{{Key: "reviewId", Value: "rcx_1"}}
	ctx.Request = httptest.NewRequest(http.MethodGet, "/?baseRef=main&headRef=HEAD", nil)
	return api.WorkspaceScopedRequest{
		AuthenticatedRequest: api.AuthenticatedRequest{
			Gin:  ctx,
			User: identity.AuthenticatedUser{User: model.User{ID: "usr_1"}},
		},
		Workspace: workspace.Summary{WorkspaceID: "wsp_1"},
	}
}
