package model

import (
	"testing"

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

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

	got, err := DecodeAppExecutionCapability([]byte(
		`{"commands":[],"tools":["list"],"scopes":["read"]}`,
	))
	require.NoError(t, err)
	require.Equal(t, []string{"list"}, got.Tools)
	require.Equal(t, []string{"read"}, got.Scopes)
	require.Equal(t, AppAuthorizationModeDefaultAllow, got.AuthorizationMode)
	require.Equal(t, AppInstallModeGeneric, got.InstallMode)
	require.True(t, got.RequiresSubscriptions)
}

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

	got, err := DecodeAppExecutionCapability([]byte(
		`{"tools":["search"],"scopes":["content.read"],` +
			`"authorizationMode":"explicit_only",` +
			`"installMode":"feature_owned",` +
			`"requiresSubscriptions":false}`,
	))
	require.NoError(t, err)
	require.Equal(t, AppAuthorizationModeExplicitOnly, got.AuthorizationMode)
	require.Equal(t, AppInstallModeFeatureOwned, got.InstallMode)
	require.False(t, got.RequiresSubscriptions)
}

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

	for name, payload := range map[string]string{
		"unknown field":     `{"tools":[],"scopes":[],"unexpectedField":"value"}`,
		"unknown auth mode": `{"authorizationMode":"sometimes"}`,
		"unknown install":   `{"installMode":"custom_only"}`,
		"wrong bool":        `{"requiresSubscriptions":"false"}`,
		"duplicate tool":    `{"tools":["search","search"]}`,
		"blank scope":       `{"scopes":[""]}`,
	} {
		payload := payload
		t.Run(name, func(t *testing.T) {
			t.Parallel()
			_, err := DecodeAppExecutionCapability([]byte(payload))
			require.Error(t, err)
		})
	}
}
