package invocationmanage

import (
	"encoding/base64"
	"strings"
	"testing"
	"time"

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

func TestListCursorRoundTrip(t *testing.T) {
	acceptedAt := time.Date(2026, 7, 21, 6, 7, 8, 9, time.FixedZone("test", 8*60*60))
	encoded, err := encodeListCursor(acceptedAt, " win_1 ")
	require.NoError(t, err)

	cursor, err := decodeListCursor(encoded)
	require.NoError(t, err)
	require.Equal(t, acceptedAt.UTC(), cursor.AcceptedAt)
	require.Equal(t, "win_1", cursor.ID)
}

func TestListCursorRejectsUntrustedPayloads(t *testing.T) {
	encode := func(payload string) string {
		return base64.RawURLEncoding.EncodeToString([]byte(payload))
	}
	validTime := "2026-07-21T06:07:08Z"
	tests := map[string]string{
		"oversized encoded input": strings.Repeat("A", maxListCursorEncodedBytes+1),
		"oversized payload":       encode(`{"acceptedAt":"` + validTime + `","id":"` + strings.Repeat("x", maxListCursorPayloadBytes) + `"}`),
		"unknown field":           encode(`{"acceptedAt":"` + validTime + `","id":"win_1","extra":true}`),
		"duplicate field":         encode(`{"acceptedAt":"` + validTime + `","id":"win_1","id":"win_2"}`),
		"trailing object":         encode(`{"acceptedAt":"` + validTime + `","id":"win_1"}{}`),
		"array":                   encode(`[]`),
		"missing id":              encode(`{"acceptedAt":"` + validTime + `"}`),
		"zero time":               encode(`{"acceptedAt":"0001-01-01T00:00:00Z","id":"win_1"}`),
	}
	for name, value := range tests {
		t.Run(name, func(t *testing.T) {
			_, err := decodeListCursor(value)
			require.Error(t, err)
			code, _, ok := ErrorDetails(err)
			require.True(t, ok)
			require.Equal(t, ErrorCodeInvalidRequest, code)
		})
	}
}
