package taskboard

import (
	"context"
	"database/sql"
	"testing"

	"github.com/stretchr/testify/require"

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

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

	const limit = taskDetailContextRefLimit
	values := make([]sql.NullString, 3*(limit+1))
	for index := 0; index < limit+1; index++ {
		values[index] = sql.NullString{String: "pin", Valid: true}
	}
	for index := 0; index < 3; index++ {
		values[limit+1+index] = sql.NullString{String: "url", Valid: true}
	}
	queryer := &taskContextRefsQueryer{row: taskContextRefsRow{values: values}}

	pinnedRefs, pinnedHasMore, relevantURLs, relevantHasMore, workspaceRefs, workspaceHasMore, err := loadTaskContextRefsLimit(context.Background(), queryer, "tsk_1", limit)
	require.NoError(t, err)
	require.Len(t, pinnedRefs, limit)
	require.True(t, pinnedHasMore)
	require.Len(t, relevantURLs, 3)
	require.False(t, relevantHasMore)
	require.Empty(t, workspaceRefs)
	require.False(t, workspaceHasMore)

	require.NotContains(t, queryer.query, "SELECT pinned_message_refs_json")
	require.Contains(t, queryer.query, "JSON_EXTRACT(pinned_message_refs_json, '$[10]')")
	require.NotContains(t, queryer.query, "JSON_EXTRACT(pinned_message_refs_json, '$[11]')")
	require.Contains(t, queryer.query, "JSON_EXTRACT(relevant_urls_json, '$[10]')")
	require.Contains(t, queryer.query, "JSON_EXTRACT(workspace_refs_json, '$[10]')")
	require.Equal(t, []any{"tsk_1"}, queryer.args)
}

type taskContextRefsQueryer struct {
	query string
	args  []any
	row   taskContextRefsRow
}

func (q *taskContextRefsQueryer) QueryRow(_ context.Context, query string, args ...any) coredb.Row {
	q.query = query
	q.args = append([]any(nil), args...)
	return q.row
}

type taskContextRefsRow struct {
	values []sql.NullString
}

func (r taskContextRefsRow) Scan(destinations ...any) error {
	for index := range destinations {
		*destinations[index].(*sql.NullString) = r.values[index]
	}
	return nil
}
