package app_test

import (
	"context"
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

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

func ensureAppAPITestScopeMembership(t *testing.T, ctx context.Context, db coredb.QueryExecer, scopeID string, memberID string, now time.Time) {
	t.Helper()

	require.NoError(t, message.EnsureScopeMembership(ctx, db, scopeID, memberID, "public", "", "active", 0, 0, now))
}

func loadAppAPITestReplyThread(t *testing.T, ctx context.Context, queryer coredb.QueryRower, workspaceID string, parentMessageID string) (threadID string, threadChannelID string) {
	t.Helper()

	require.NoError(t, queryer.QueryRow(ctx, `
SELECT child_scope.id, child_scope.id
FROM scopes child_scope
WHERE child_scope.workspace_id = $1
  AND child_scope.type = 'thread'
  AND child_scope.root_message_id = $2
  AND child_scope.status = 'active'
  AND child_scope.archived_at IS NULL
LIMIT 1
`, workspaceID, parentMessageID).Scan(&threadID, &threadChannelID))
	require.NotEmpty(t, threadID)
	require.NotEmpty(t, threadChannelID)
	return threadID, threadChannelID
}

func appAPITestMessageWithContent(messages []message.AppMessage, content string) (message.AppMessage, bool) {
	for _, msg := range messages {
		if msg.Content == content {
			return msg, true
		}
	}
	return message.AppMessage{}, false
}

func requireAppAPITestMessageWithContent(t *testing.T, messages []message.AppMessage, content string) message.AppMessage {
	t.Helper()

	msg, ok := appAPITestMessageWithContent(messages, content)
	require.True(t, ok, "message with content %q not found in messages: %s", content, appAPITestMessageContents(messages))
	return msg
}

func appAPITestMessageContents(messages []message.AppMessage) []string {
	contents := make([]string, 0, len(messages))
	for _, msg := range messages {
		contents = append(contents, fmt.Sprintf("%s:%q", msg.ID, msg.Content))
	}
	return contents
}
