package eino

import (
	"context"
	"strings"
	"testing"

	"github.com/sundynix/sundynix-dispatcher/internal/harness"
	"github.com/sundynix/sundynix-dispatcher/internal/llm"
	"github.com/sundynix/sundynix-shared/contract"
)

// TestAgentCollaborationPassesOutput 验证编排式多智能体接力：
// agent1 的产出注入 agent2 的上下文，agent2 基于它继续；最终成稿 = 下游 agent 的产出。
func TestAgentCollaborationPassesOutput(t *testing.T) {
	graph := `{"version":"1","nodes":[
		{"id":"a1","kind":"agent","config":{"system":"研究"}},
		{"id":"a2","kind":"agent","config":{"system":"撰写"}}
	],"edges":[{"source":"a1","target":"a2"}]}`

	saw := false
	ll := &fakeLLM{ready: true, stream: func(m []llm.ChatMessage) string {
		var sys string
		for _, x := range m {
			if x.Role == "system" {
				sys = x.Content
			}
		}
		if strings.Contains(sys, "研究产出XYZ") { // agent1 的产出出现在 agent2 的 system → 接力成功
			saw = true
			return "最终报告：基于上游研究撰写"
		}
		return "研究产出XYZ"
	}}
	o := &Orchestrator{pool: ll, breaker: harness.NewCircuitBreaker(), sink: &fakeSink{}}
	ans, _, err := o.runComposeGraph(context.Background(), &contract.Task{ID: "tc", Graph: []byte(graph)}, &execTracer{})
	if err != nil {
		t.Fatal(err)
	}
	if !saw {
		t.Fatal("下游 agent 未看到上游 agent 的产出——协作没接力")
	}
	if !strings.Contains(ans, "最终报告") {
		t.Fatalf("最终成稿应为下游 agent 产出，得 %q", ans)
	}
}
