package app

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/core/domain"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

func TestMaterializeWorkflowRecoveryResponderPresentationUsesResolvedRecipient(t *testing.T) {
	presentation := domain.NewWorkflowRecoveryPresentationWithResponderMention(
		"wri_1", "wfx_1", "wfx_1", 1, domain.WorkflowRecoveryMaxAttempts,
		domain.WorkflowRecoveryResponderMention{Type: "agent", ID: "agt_authored", Token: "authored"},
	)
	value, err := presentation.MetadataValue()
	require.NoError(t, err)
	metadata := map[string]any{domain.MessagePresentationMetadataKey: value}

	err = materializeWorkflowRecoveryResponderPresentation(metadata, message.AgentRecipient{
		AgentID:       "agt_frozen",
		MentionToken:  "frozen-agent",
		AgentMemberID: "mem_frozen",
	})
	require.NoError(t, err)

	got, err := domain.MessagePresentationFromMetadata(metadata)
	require.NoError(t, err)
	require.NotNil(t, got)
	var args domain.WorkflowRecoveryPresentationArgs
	require.NoError(t, json.Unmarshal(got.Args, &args))
	require.Equal(t, &domain.WorkflowRecoveryResponderMention{
		Type: "agent", ID: "agt_frozen", Token: "frozen-agent",
	}, args.ResponderMention)
}

func TestWorkflowRecoveryResponderMentionIsExcludedFromReplayDigest(t *testing.T) {
	presentation := domain.NewWorkflowRecoveryPresentationWithResponderMention(
		"wri_1", "wfx_1", "wfx_1", 1, domain.WorkflowRecoveryMaxAttempts,
		domain.WorkflowRecoveryResponderMention{Type: "agent", ID: "agt_frozen", Token: "frozen-agent"},
	)
	value, err := presentation.MetadataValue()
	require.NoError(t, err)
	metadata := map[string]any{domain.MessagePresentationMetadataKey: value}

	stripped := message.MetadataWithoutDerivedWorkflowResponder(metadata)
	got, err := domain.MessagePresentationFromMetadata(stripped)
	require.NoError(t, err)
	require.NotNil(t, got)
	var args domain.WorkflowRecoveryPresentationArgs
	require.NoError(t, json.Unmarshal(got.Args, &args))
	require.Nil(t, args.ResponderMention)
}
