package onboarding

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

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

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

	ctx := context.Background()
	db := startOnboardingRollbackDB(t, ctx)
	fixture := seedOnboardingThreadConversation(t, ctx, db, "mock_target")
	now := time.Now().UTC()
	require.NoError(t, message.EnsureScopeMembership(ctx, db, fixture.channelID, fixture.agentMemberID, "public", "", "onboarding-mock", 0, 0, now))
	mustOnboardingExec(t, ctx, db, `
UPDATE scopes
SET root_message_short_id = 'mock123'
WHERE id = $1
`, fixture.threadID)
	mustOnboardingExec(t, ctx, db, `
UPDATE scope_messages
SET client_message_id = 'mock-start-client',
    idempotency_payload_digest = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
WHERE id = $1
`, fixture.messageID)
	mustOnboardingExec(t, ctx, db, `
UPDATE scope_messages
SET client_message_id = 'mock-start-client:request',
    idempotency_payload_digest = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
WHERE id = $1
`, fixture.evidence.MessageID)
	mustOnboardingExec(t, ctx, db, `
UPDATE scope_messages
SET client_message_id = 'mock-start-client:reply',
    idempotency_payload_digest = 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'
WHERE id = $1
`, fixture.replyMessageID)

	store := New(db)
	start, err := store.ResolveMockAgentTarget(ctx, fixture.userID, fixture.workspaceID, fixture.channelID, fixture.agentID)
	require.NoError(t, err)
	require.Equal(t, fixture.agentID, start.AgentID)
	require.Equal(t, fixture.agentMemberID, start.AgentMemberID)
	require.NotEmpty(t, start.TutorialChannelSlug)

	reply, err := store.ResolveMockReplyTarget(
		ctx,
		fixture.userID,
		fixture.workspaceID,
		fixture.threadID,
		fixture.agentID,
		fixture.evidence.MessageID,
		"mock-start-client:reply",
	)
	require.NoError(t, err)
	require.Equal(t, fixture.threadID, reply.ThreadScopeID)
	require.Equal(t, "#"+start.TutorialChannelSlug+":mock123", reply.ThreadTargetRef)
	require.Equal(t, fixture.replyMessageID, reply.ExistingReplyMessageID)

	mustOnboardingExec(t, ctx, db, `
UPDATE desktop_onboarding_states
SET status = 'completed', current_step = 'done', completed_at = $3
WHERE user_id = $1 AND workspace_id = $2
`, fixture.userID, fixture.workspaceID, now)
	replayed, err := store.ResolveMockReplyTarget(
		ctx,
		fixture.userID,
		fixture.workspaceID,
		fixture.threadID,
		fixture.agentID,
		fixture.evidence.MessageID,
		"mock-start-client:reply",
	)
	require.NoError(t, err)
	require.Equal(t, fixture.replyMessageID, replayed.ExistingReplyMessageID)

	_, err = store.ResolveMockReplyTarget(
		ctx,
		fixture.userID,
		fixture.workspaceID,
		fixture.threadID,
		fixture.agentID,
		fixture.messageID,
		"mock-start-client:reply",
	)
	require.ErrorIs(t, err, ErrMockExchangeUnavailable)

	_, err = store.ResolveMockReplyTarget(
		ctx,
		fixture.userID,
		fixture.workspaceID,
		fixture.threadID,
		fixture.agentID,
		fixture.evidence.MessageID,
		"unrelated-client:reply",
	)
	require.ErrorIs(t, err, ErrMockExchangeUnavailable)
}
