package im

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/workflow/planmanage"
)

func TestLiveEventEmitterBroadcastsWorkflowPlanDraftUpdate(t *testing.T) {
	t.Parallel()

	ctx, cancel := context.WithCancel(context.Background())
	t.Cleanup(cancel)
	hub := NewStreamEventHub()
	owner := hub.SubscribeStreamEvents(ctx, "wsp_1", "mem_owner", "usr_owner")
	peer := hub.SubscribeStreamEvents(ctx, "wsp_1", "mem_peer", "usr_peer")
	outside := hub.SubscribeStreamEvents(ctx, "wsp_2", "mem_outside", "usr_outside")
	defer owner.Close()
	defer peer.Close()
	defer outside.Close()

	NewLiveEventEmitter(hub, nil, nil).EmitWorkflowPlanDraftUpdated(planmanage.Draft{
		WorkspaceID: " wsp_1 ",
		PlanID:      " pln_1 ",
		Revision:    8,
		UpdatedBy: planmanage.Actor{
			Type:     planmanage.ActorTypeAgent,
			ID:       " agt_editor ",
			MemberID: " mem_agent ",
		},
	})

	for _, subscription := range []*StreamEventSubscription{owner, peer} {
		event := receiveHubEvent(t, subscription)
		require.Equal(t, liveEventTypeWorkflowPlanDraftUpdated, event.Type)
		require.Equal(t, "wsp_1", event.WorkspaceID)
		require.Zero(t, event.EventSeq)
		require.Empty(t, event.EventID)
		require.Equal(t, map[string]any{
			"workspaceId": "wsp_1",
			"planId":      "pln_1",
			"revision":    int64(8),
			"updatedBy": map[string]any{
				"type":     planmanage.ActorTypeAgent,
				"id":       "agt_editor",
				"memberId": "mem_agent",
			},
		}, event.Payload)
	}
	requireNoHubEvent(t, outside)
}

func TestLiveEventEmitterDropsIncompleteWorkflowPlanDraftUpdate(t *testing.T) {
	t.Parallel()

	ctx, cancel := context.WithCancel(context.Background())
	t.Cleanup(cancel)
	hub := NewStreamEventHub()
	subscriber := hub.SubscribeStreamEvents(ctx, "wsp_1", "mem_1", "usr_1")
	defer subscriber.Close()
	emitter := NewLiveEventEmitter(hub, nil, nil)

	emitter.EmitWorkflowPlanDraftUpdated(planmanage.Draft{
		PlanID: "pln_1", Revision: 1,
	})
	emitter.EmitWorkflowPlanDraftUpdated(planmanage.Draft{
		WorkspaceID: "wsp_1", Revision: 1,
	})
	emitter.EmitWorkflowPlanDraftUpdated(planmanage.Draft{
		WorkspaceID: "wsp_1", PlanID: "pln_1",
	})

	requireNoHubEvent(t, subscriber)
}
