package taskboard

import (
	"testing"
	"time"

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

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

	normalized := normalizeTaskBrowseQuery(TaskBrowseQuery{})
	require.Equal(t, taskBrowseDefaultLimit, normalized.Limit)
	require.Equal(t, taskBoardDefaultSortMode, normalized.SortMode)
	require.Empty(t, normalized.SearchQuery)
	require.Empty(t, normalized.QuickFilters)
	require.Empty(t, normalized.StructuredFilters)
	require.Empty(t, normalized.Cursor)
	require.Empty(t, normalized.ColumnCursors)

	normalized = normalizeTaskBrowseQuery(TaskBrowseQuery{
		Limit:       taskBrowseMaxLimit + 50,
		SearchQuery: "  Task   Browse  ",
		QuickFilters: []string{
			"blocked",
			"blocked",
			"unknown",
		},
		StructuredFilters: map[string][]string{
			"status":   {"todo", "todo"},
			"channel":  {"chn-1", "chn-1"},
			"priority": {"p1", "p1"},
			"unknown":  {"nope"},
		},
		SortMode: " recently_updated ",
		ColumnCursors: map[string]TaskBrowseCursor{
			string(TaskBrowseColumnTodo): {
				SortMode:   "manual",
				TaskID:     "tsk-todo",
				CreatedAt:  time.Date(2026, 4, 24, 6, 0, 0, 0, time.UTC),
				TaskNumber: 1,
			},
			"unknown": {
				SortMode:   "manual",
				TaskID:     "tsk-unknown",
				CreatedAt:  time.Date(2026, 4, 24, 6, 0, 0, 0, time.UTC),
				TaskNumber: 2,
			},
			string(TaskBrowseColumnInProgress): {},
		},
	})
	require.Equal(t, taskBrowseMaxLimit, normalized.Limit)
	require.Equal(t, "task browse", normalized.SearchQuery)
	require.Equal(t, []string{"blocked"}, normalized.QuickFilters)
	require.Equal(t, map[string][]string{
		"status":   {"todo"},
		"channel":  {"chn-1"},
		"priority": {"p1"},
	}, normalized.StructuredFilters)
	require.Equal(t, "recently_updated", normalized.SortMode)
	require.Equal(t, map[string]TaskBrowseCursor{
		string(TaskBrowseColumnTodo): {
			SortMode:   "manual",
			TaskID:     "tsk-todo",
			CreatedAt:  time.Date(2026, 4, 24, 6, 0, 0, 0, time.UTC),
			TaskNumber: 1,
		},
		"unknown": {
			SortMode:   "manual",
			TaskID:     "tsk-unknown",
			CreatedAt:  time.Date(2026, 4, 24, 6, 0, 0, 0, time.UTC),
			TaskNumber: 2,
		},
	}, normalized.ColumnCursors)
}

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

	_, err := normalizeTaskBrowseCursor(TaskBrowseCursor{
		SortMode:   "priority",
		TaskID:     "tsk_1",
		CreatedAt:  time.Date(2026, 4, 24, 6, 0, 0, 0, time.UTC),
		TaskNumber: 1,
	}, taskBoardDefaultSortMode)
	require.ErrorContains(t, err, "invalid browse cursor")
}
