package promptcompiler

import (
	"strings"
	"testing"

	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

// TestFormatWorkflowTeamContextPromptDetailsWhitelist proves the dedicated
// Workflow-specific formatter renders ONLY the minimal whitelist: team
// identity/purpose, the responder's top-level teamMemberId, role label, and
// role overlay/duty. It never renders the roster, ordinary @Team invocation
// copy, leader responsibility updates, or any Team division hint.
func TestFormatWorkflowTeamContextPromptDetailsWhitelist(t *testing.T) {
	contexts := []types.TeamContext{{
		TeamID:            "team_wf",
		TeamHandle:        "wf-team",
		TeamDisplayName:   "WF Team",
		TeamDescription:   "Ship the release.",
		TeamMemberID:      "wtm_member",
		Role:              "member",
		RoleLabel:         "Builder",
		RoleOverlayPrompt: "Build delegated work.",
		MemberRoster: []types.TeamRosterMember{{
			TeamMemberID: "wtm_other", DisplayName: "Other Member", RoleLabel: "Reviewer",
		}},
		Workflow: true,
	}}
	prompt := formatWorkflowTeamContextPromptDetails(contexts)
	for _, want := range []string{"team_wf", "wtm_member", "Builder", "Build delegated work.", "Ship the release."} {
		if !strings.Contains(prompt, want) {
			t.Fatalf("workflow prompt missing %q:\n%s", want, prompt)
		}
	}
	for _, forbidden := range []string{"member roster", "Other Member", "Reviewer", "Team responsibility updates", "team invocation", "wake", "leader"} {
		if strings.Contains(prompt, forbidden) {
			t.Fatalf("workflow prompt leaked forbidden %q:\n%s", forbidden, prompt)
		}
	}
}

// TestFormatWorkflowTeamContextSkipsNonWorkflow proves ordinary @Team contexts
// are not rendered by the Workflow formatter (they keep the ordinary formatter).
func TestFormatWorkflowTeamContextSkipsNonWorkflow(t *testing.T) {
	contexts := []types.TeamContext{{
		TeamID: "team_ordinary", TeamMemberID: "wtm_ordinary", Workflow: false,
	}}
	if got := formatWorkflowTeamContextPromptDetails(contexts); got != "" {
		t.Fatalf("expected empty workflow prompt, got: %q", got)
	}
}

// TestWorkflowTeamContextSkipsLeaderResponsibilityUpdate proves a workflow
// member with role=leader still does NOT get the ordinary leader responsibility
// update instruction (forbidden by the workflow whitelist).
func TestWorkflowTeamContextSkipsLeaderResponsibilityUpdate(t *testing.T) {
	contexts := []types.TeamContext{{
		TeamID: "team_wf", TeamMemberID: "wtm_leader", Role: "leader", RoleLabel: "Coordinator",
		Workflow: true,
	}}
	prompt := formatWorkflowTeamContextPromptDetails(contexts)
	if strings.Contains(prompt, "Team responsibility updates") {
		t.Fatalf("workflow prompt leaked leader responsibility update:\n%s", prompt)
	}
	if !strings.Contains(prompt, "wtm_leader") {
		t.Fatalf("workflow prompt missing teamMemberId:\n%s", prompt)
	}
}
