package agent

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/drivercontract"
	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/runtimeconfig"
	"github.com/tidbcloud/AgentTeam/desktop/internal/promptcompiler"
	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

func TestActualAdapterPreparationBoundariesConsumeCompilerSurfaces(t *testing.T) {
	for _, runtime := range []string{"codex", "claude", "opencode", "kimi", "pi"} {
		runtime := runtime
		t.Run(runtime, func(t *testing.T) {
			launch := adapterMatrixLaunchCarrier(t, runtime)
			cfg := drivercontract.LaunchConfig{RuntimeType: runtimeconfig.RuntimeType(runtime), WorkDir: t.TempDir(), SessionID: "session-matrix", CompiledPrompt: &launch}
			require.True(t, launch.HasLaunchCarrier())
			switch runtime {
			case "codex":
				driver := &CodexAppServerDriver{}
				params, err := driver.resumeThreadParams(cfg, "thread-matrix")
				require.NoError(t, err)
				require.Equal(t, launch.LaunchSurface("baseInstructions"), params["baseInstructions"])
			case "claude":
				require.Equal(t, launch.LaunchSurface("resumePrompt"), resolveClaudeInitialPromptForSession(cfg, cfg.SessionID))
			case "kimi":
				require.Equal(t, launch.LaunchSurface("kimiInitialPrompt"), kimiInitialPrompt(cfg, true))
				input := adapterMatrixDeliveryInput(t, runtime)
				blocks, err := kimiACPPromptBlocks(input)
				require.NoError(t, err)
				require.NotEmpty(t, blocks)
			case "pi":
				require.Equal(t, launch.InitialPrompt(true), piInitialPrompt(cfg, true))
			case "opencode":
				input := adapterMatrixDeliveryInput(t, runtime)
				parts := openCodePromptParts(input)
				require.Len(t, parts, 1)
				require.Equal(t, input.PromptText(), parts[0]["text"])
			}
		})
	}
}

func adapterMatrixLaunchCarrier(t *testing.T, runtime string) promptcompiler.CompiledPrompt {
	t.Helper()
	carrier, err := promptcompiler.New(promptcompiler.DefaultPolicy()).CompileLaunchPrompt(context.Background(), promptcompiler.LaunchCompileDescriptor{
		EventID: "adapter-matrix", TurnEventType: promptcompiler.EventResume, SessionID: "session-matrix", Runtime: runtime,
		ContractMode: promptcompiler.LaunchContractModeForRuntime(runtime), ContractCarrierFile: promptcompiler.LaunchContractFileForRuntime(runtime),
		FreshFallbackOnResume: promptcompiler.LaunchNeedsFreshFallbackOnResume(runtime),
	}, promptcompiler.LaunchCompileInput{Input: promptcompiler.CompileInput{
		AgentID: "agt-matrix", AgentName: "matrix", Runtime: runtime,
		Message: types.InboxMessage{MessageID: "msg-matrix", Target: "#matrix", Content: "resume matrix", AuthorProfile: types.AuthorProfile{ActorType: "human", DisplayName: "alice"}},
	}})
	require.NoError(t, err)
	return carrier
}

func adapterMatrixDeliveryInput(t *testing.T, runtime string) drivercontract.RuntimeInput {
	t.Helper()
	carrier, err := promptcompiler.New(promptcompiler.DefaultPolicy()).CompileDeliveryPrompt(context.Background(), promptcompiler.EventRoutedMessageDelivery, "adapter-delivery", promptcompiler.CompileInput{
		AgentID: "agt-matrix", Runtime: runtime,
		Delivery: promptcompiler.DeliveryCompileInput{MessageID: "msg-matrix", Target: "#matrix", ChannelType: "channel", AuthorIdentity: types.AuthorIdentity{ActorType: "human", DisplayName: "alice"}, Content: "delivery matrix", MessageType: "text"},
	}, runtime)
	require.NoError(t, err)
	return drivercontract.RuntimeInput{ID: "msg-matrix", CompiledPrompt: &carrier}
}
