// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

package controller

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/hashicorp/consul/internal/resource"
	"github.com/hashicorp/consul/proto-public/pbresource"
	"github.com/hashicorp/consul/proto/private/prototest"
)

func TestMakeRequests(t *testing.T) {
	redType := &pbresource.Type{
		Group:        "colors",
		GroupVersion: "vfake",
		Kind:         "red",
	}
	blueType := &pbresource.Type{
		Group:        "colors",
		GroupVersion: "vfake",
		Kind:         "blue",
	}

	casparID := &pbresource.ID{
		Type:    redType,
		Tenancy: resource.DefaultNamespacedTenancy(),
		Name:    "caspar",
		Uid:     "ignored",
	}
	babypantsID := &pbresource.ID{
		Type:    redType,
		Tenancy: resource.DefaultNamespacedTenancy(),
		Name:    "babypants",
		Uid:     "ignored",
	}
	zimRef := &pbresource.Reference{
		Type:    redType,
		Tenancy: resource.DefaultNamespacedTenancy(),
		Name:    "zim",
		Section: "ignored",
	}
	girRef := &pbresource.Reference{
		Type:    redType,
		Tenancy: resource.DefaultNamespacedTenancy(),
		Name:    "gir",
		Section: "ignored",
	}

	newBlueReq := func(name string) Request {
		return Request{
			ID: &pbresource.ID{
				Type:    blueType,
				Tenancy: resource.DefaultNamespacedTenancy(),
				Name:    name,
			},
		}
	}

	require.Nil(t, MakeRequests[*pbresource.ID](blueType, nil))
	require.Nil(t, MakeRequests[*pbresource.Reference](blueType, nil))

	prototest.AssertElementsMatch(t, []Request{
		newBlueReq("caspar"), newBlueReq("babypants"),
	}, MakeRequests[*pbresource.ID](blueType, []*pbresource.ID{
		casparID, babypantsID,
	}))

	prototest.AssertElementsMatch(t, []Request{
		newBlueReq("gir"), newBlueReq("zim"),
	}, MakeRequests[*pbresource.Reference](blueType, []*pbresource.Reference{
		girRef, zimRef,
	}))
}