package registry

import (
	"testing"

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

func TestRegisterBuiltin_RequiredScopesAreAndCloneSafe(t *testing.T) {
	definition := makeBuiltinDefinition(t, "scoped", 1, "read", "read")
	definition.Actions[0].RequiredScopes = []string{"mail.send", "mail.metadata.read"}
	reordered := makeBuiltinDefinition(t, "scoped", 1, "read", "read")
	reordered.Actions[0].RequiredScopes = []string{"mail.metadata.read", "mail.send"}
	changed := makeBuiltinDefinition(t, "scoped", 1, "read", "read")
	changed.Actions[0].RequiredScopes = []string{"mail.metadata.read"}

	digest, err := computeBuiltinDigest(definition, "rev-1")
	require.NoError(t, err)
	reorderedDigest, err := computeBuiltinDigest(reordered, "rev-1")
	require.NoError(t, err)
	changedDigest, err := computeBuiltinDigest(changed, "rev-1")
	require.NoError(t, err)
	require.Equal(t, digest, reorderedDigest)
	require.NotEqual(t, digest, changedDigest)

	reg := New()
	registered, err := reg.RegisterBuiltin(
		definition,
		fakeExecutor{},
		"rev-1",
	)
	require.NoError(t, err)
	registered.Definition.Actions[0].RequiredScopes[0] = "mutated"

	again, ok := reg.LookupByDigest(digest)
	require.True(t, ok)
	require.Equal(
		t,
		[]string{"mail.metadata.read", "mail.send"},
		again.Definition.Actions[0].RequiredScopes,
	)

	invalid := makeBuiltinDefinition(t, "invalid-scopes", 1, "read", "read")
	invalid.Actions[0].RequiredScopes = []string{"mail.send", "mail.send"}
	_, err = reg.RegisterBuiltin(invalid, fakeExecutor{}, "rev-1")
	require.ErrorContains(t, err, "duplicate required scope")
}
