package resourcepool

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	resourcepoolrepo "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/resourcepool"
)

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

	request := &globalngv1.ListResourcePoolsRequest{
		ResourcePoolName: "  Example Pool ",
		ProviderIds:      []globalcommonv1.CloudProvider_Name{globalcommonv1.CloudProvider_GCP, globalcommonv1.CloudProvider_AWS},
		OwnerType:        globalngv1.ResourcePool_ORGANIZATION,
		OwnerIds:         []uint64{42},
		LifecycleStates:  []globalngv1.ResourcePool_LifecycleState{globalngv1.ResourcePool_FAILED, globalngv1.ResourcePool_ACTIVE},
	}
	want := resourcepoolrepo.Cursor{
		CreatedAt: time.Date(2026, time.July, 21, 10, 11, 12, 123000000, time.UTC),
		ID:        1234,
	}

	token, err := buildResourcePoolListPageToken(request, want)
	require.NoError(t, err)
	request.PageToken = token
	got, parseErr := parseResourcePoolListPageToken(request)
	require.NoError(t, parseErr)
	require.Equal(t, want, *got)
}

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

	request := &globalngv1.ListResourcePoolsRequest{
		ResourcePoolName: "Straße",
		OwnerIds:         []uint64{9, 7},
		LifecycleStates:  []globalngv1.ResourcePool_LifecycleState{globalngv1.ResourcePool_FAILED, globalngv1.ResourcePool_ACTIVE},
	}
	token, err := buildResourcePoolListPageToken(request, resourcepoolrepo.Cursor{
		CreatedAt: time.Now().UTC(),
		ID:        99,
	})
	require.NoError(t, err)

	reordered := &globalngv1.ListResourcePoolsRequest{
		ResourcePoolName: " strasse ",
		OwnerIds:         []uint64{7, 9},
		LifecycleStates:  []globalngv1.ResourcePool_LifecycleState{globalngv1.ResourcePool_ACTIVE, globalngv1.ResourcePool_FAILED},
		PageToken:        token,
	}
	_, parseErr := parseResourcePoolListPageToken(reordered)
	require.NoError(t, parseErr)

	reordered.OwnerIds = []uint64{7, 10}
	_, parseErr = parseResourcePoolListPageToken(reordered)
	require.Error(t, parseErr)
}

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

	request := &globalngv1.ListResourcePoolsRequest{PageToken: "not-a-token"}
	_, err := parseResourcePoolListPageToken(request)
	require.Error(t, err)
}
