package app

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/store/serviceactor"
)

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

	require.True(t, serviceDefinitionUsesInternalHandler([]byte(`{"executionTransport":"internal_handler","handlerKey":"agentteam.approval"}`)))
	require.False(t, serviceDefinitionUsesInternalHandler([]byte(`{"executionTransport":"callback"}`)))
	require.False(t, serviceDefinitionUsesInternalHandler([]byte(`{"executionTransport":true}`)))
	require.False(t, serviceDefinitionUsesInternalHandler([]byte(`not-json`)))
	require.False(t, serviceDefinitionUsesInternalHandler(nil))
}

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

	tests := []struct {
		name    string
		summary serviceactor.InstallationSummary
		visible bool
	}{
		{
			name: "user installed app",
			summary: serviceactor.InstallationSummary{
				Installation: serviceactor.Installation{Metadata: []byte(`{"builtin":false}`)},
				Definition:   serviceactor.Definition{Config: []byte(`{"executionTransport":"callback"}`)},
			},
			visible: true,
		},
		{
			name: "builtin installation marker",
			summary: serviceactor.InstallationSummary{
				Installation: serviceactor.Installation{Metadata: []byte(`{"builtin":true}`)},
				Definition:   serviceactor.Definition{Config: []byte(`{"executionTransport":"callback"}`)},
			},
			visible: false,
		},
		{
			name: "internal handler definition",
			summary: serviceactor.InstallationSummary{
				Installation: serviceactor.Installation{Metadata: []byte(`{}`)},
				Definition:   serviceactor.Definition{Config: []byte(`{"executionTransport":"internal_handler"}`)},
			},
			visible: false,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			require.Equal(t, test.visible, serviceActorSummaryVisibleInAppManagement(test.summary))
		})
	}
}

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

	hidden := newHiddenAppIdentities()
	hidden.add(" svcdef_builtin ", " builtin-app ")

	require.True(t, hidden.contains("svcdef_builtin", "different"))
	require.True(t, hidden.contains("different", "builtin-app"))
	require.False(t, hidden.contains("app_user", "user-app"))
}
