package im

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
)

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

	ctx, cancel := context.WithCancel(context.Background())
	t.Cleanup(cancel)
	hub := NewStreamEventHub()
	target := hub.SubscribeStreamEvents(ctx, "wsp_1", "mem_target", "usr_target")
	otherTeam := hub.SubscribeStreamEvents(ctx, "wsp_1", "mem_other", "usr_other")
	otherWorkspace := hub.SubscribeStreamEvents(ctx, "wsp_2", "mem_outside", "usr_outside")
	hub.SubscribeScopeForUser("wsp_1", "usr_target", "chn_team_1")
	hub.SubscribeScopeForUser("wsp_1", "usr_other", "chn_team_2")
	hub.SubscribeScopeForUser("wsp_2", "usr_outside", "chn_team_1")

	NewLiveEventEmitter(hub, nil, nil).EmitTeamWorkflowsUpdated(
		" wsp_1 ", " chn_team_1 ", " team_1 ", " twf_1 ", 7,
	)

	event := receiveHubEvent(t, target)
	require.Equal(t, liveEventTypeTeamWorkflowsUpdated, event.Type)
	require.Equal(t, "wsp_1", event.WorkspaceID)
	require.Equal(t, "chn_team_1", event.ScopeID)
	require.Zero(t, event.EventSeq)
	require.Equal(t, map[string]any{
		"workspaceId":    "wsp_1",
		"sourceScopeId":  "chn_team_1",
		"teamId":         "team_1",
		"teamWorkflowId": "twf_1",
		"revision":       int64(7),
	}, event.Payload)
	requireNoHubEvent(t, otherTeam)
	requireNoHubEvent(t, otherWorkspace)
}

func TestLiveEventEmitterDropsIncompleteTeamWorkflowUpdate(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")
	hub.SubscribeScopeForUser("wsp_1", "usr_1", "chn_team_1")
	emitter := NewLiveEventEmitter(hub, nil, nil)

	emitter.EmitTeamWorkflowsUpdated("", "chn_team_1", "team_1", "twf_1", 1)
	emitter.EmitTeamWorkflowsUpdated("wsp_1", "", "team_1", "twf_1", 1)
	emitter.EmitTeamWorkflowsUpdated("wsp_1", "chn_team_1", "", "twf_1", 1)
	emitter.EmitTeamWorkflowsUpdated("wsp_1", "chn_team_1", "team_1", "", 1)
	emitter.EmitTeamWorkflowsUpdated("wsp_1", "chn_team_1", "team_1", "twf_1", 0)

	requireNoHubEvent(t, subscriber)
}
