package exec

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

	"github.com/stretchr/testify/require"

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

func TestWorkflowPlanShowAcceptsImmutableVersionRef(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) {
		_, _ = io.WriteString(writer, `{
			"planId":"pln_1",
			"scopeId":"pln_1",
			"planRevision":3,
			"state":"active",
			"source":"apiVersion: loop.plan/v1",
			"workingRevision":4,
			"planVersion":{"id":"plv_1"}
		}`)
	}))
	t.Cleanup(server.Close)

	result, err := (workflowHandler{}).plan(context.Background(), actionScopedJSON[workflowPlanRequest]{
		Authorized: runtimeAuthorization{Server: &apiclient.Client{
			ServerURL: server.URL, RouteWorkspaceID: "ws_1", AgentID: "agt_1", LocalAgentID: "agt_1",
			AuthToken: "token", HTTPClient: server.Client(),
		}},
		Body: workflowPlanRequest{Action: "show", PlanID: "pln_1"},
	})
	require.NoError(t, err)
	require.Equal(t, "plv_1", result.Data.agentView.PlanVersion.ID)
}

func TestWorkflowPlanPublishAcceptsImmutableVersionIdentity(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) {
		_, _ = io.WriteString(writer, `{
			"plan":{
				"id":"pln_1",
				"scopeId":"pln_1",
				"key":"plan",
				"displayName":"Plan",
				"descriptionMd":"",
				"state":"active",
				"revision":3,
				"currentVersion":{"id":"plv_1"},
				"defaultVersion":{"id":"plv_1"},
				"createdBy":{"type":"agent","id":"agt_1","memberId":"mem_1"},
				"createdAt":"2026-08-15T00:00:00Z",
				"updatedBy":{"type":"agent","id":"agt_1","memberId":"mem_1"},
				"updatedAt":"2026-08-15T00:00:00Z"
			},
			"version":{
				"id":"plv_1",
				"planId":"pln_1",
				"draftRevision":4,
				"source":"apiVersion: loop.plan/v1",
				"layout":{},
				"compilerVersion":"compiler",
				"digest":"digest",
				"publishedBy":{"type":"agent","id":"agt_1","memberId":"mem_1"},
				"publishedAt":"2026-08-15T00:00:00Z"
			}
		}`)
	}))
	t.Cleanup(server.Close)

	result, err := (workflowHandler{}).plan(context.Background(), actionScopedJSON[workflowPlanRequest]{
		Authorized: runtimeAuthorization{Server: &apiclient.Client{
			ServerURL: server.URL, RouteWorkspaceID: "ws_1", AgentID: "agt_1", LocalAgentID: "agt_1",
			AuthToken: "token", HTTPClient: server.Client(),
		}},
		Body: workflowPlanRequest{Action: "publish", PlanID: "pln_1", ExpectedRevision: 4},
	})
	require.NoError(t, err)
	require.Equal(t, "plv_1", result.Data.publish.Version.ID)
}
