package changefeed

import (
	"encoding/base64"
	"math"
	"strings"
	"testing"
)

func TestPageTokenRoundTrip(t *testing.T) {
	tcs := []uint32{1, 2, 42, 65535, math.MaxUint32 - 1}
	for _, page := range tcs {
		// encode
		tok, err := encodePageToken(page)
		if err != nil {
			t.Fatalf("encodePageToken(%d) error: %v", page, err)
		}

		// decode
		p, err := decodePageToken(tok)
		if err != nil {
			t.Fatalf("decodePageToken(token) error: %v", err)
		}
		if p != page {
			t.Fatalf("roundtrip mismatch: got %d, want %d", p, page)
		}
	}

	// empty token should decode to page 1
	p, err := decodePageToken("")
	if err != nil {
		t.Fatalf("decodePageToken(empty) error: %v", err)
	}
	if p != 1 {
		t.Fatalf("empty token -> page %d, want 1", p)
	}
}

func TestDecodePageTokenInvalid(t *testing.T) {
	invalid := []string{
		"!!!not-base64!!!",
		"Zm9vYmFy",            // base64 for "foobar", not json
		"eyJwYWdlIjoiMTIzIn0", // base64url of JSON with string page
		base64.RawURLEncoding.EncodeToString([]byte(`{"page":0}`)),
		base64.RawURLEncoding.EncodeToString([]byte(`{"page":4294967295}`)),
	}
	for _, tok := range invalid {
		_, err := decodePageToken(tok)
		if err == nil {
			t.Fatalf("expected error for token %q", tok)
		}
		if !strings.HasPrefix(err.Error(), "invalid page_token:") {
			t.Fatalf("unexpected error prefix: %v", err)
		}
	}
}
