package app

import (
	"testing"

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

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

	query, args := buildListServiceEventSubscriptionsQuery(listServiceEventSubscriptionsQueryParams{
		WorkspaceID:          "wsp_scope",
		ServiceDefinitionIDs: []string{"app_github"},
		SubscriptionKind:     "pull_request",
		OwnerMemberID:        "mem_scope_human",
		OwnerUserID:          "usr_scope_human",
		RequestedLimit:       20,
	})

	require.Contains(t, query, "subscription.owner_member_id = $")
	require.Contains(t, query, "subscription.created_by_actor_type <> 'agent'")
	require.Contains(t, query, "subscription.created_by_actor_type = 'agent'")
	require.Contains(t, query, "creator_agent.id = subscription.created_by_actor_id")
	require.Contains(t, query, "creator_machine.created_by_user_id = $")
	require.Contains(t, query, "NOT EXISTS")
	require.Contains(t, query, "existing_creator_agent.id = subscription.created_by_actor_id")
	require.Contains(t, query, "$."+serviceEventSubscriptionOwnerMemberIDSourceMetadataKey)
	require.Contains(t, args, "mem_scope_human")
	require.Contains(t, args, "usr_scope_human")
	require.Contains(t, args, serviceEventSubscriptionOwnerMemberIDSourceAgentMachineV1)
}

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

	record := ServiceEventSubscriptionRecord{
		CreatedByActorType: "agent",
		Metadata:           []byte(`{"owner_member_id_source":"agent_machine_owner_v1","caller":"preserved"}`),
	}
	require.True(t, serviceEventSubscriptionHasAuthoritativeAgentMachineOwner(record))

	record.Metadata = []byte(`{"caller":"legacy-unmarked"}`)
	require.False(t, serviceEventSubscriptionHasAuthoritativeAgentMachineOwner(record))

	record.Metadata = []byte(`{"owner_member_id_source":"forged-future-version"}`)
	require.False(t, serviceEventSubscriptionHasAuthoritativeAgentMachineOwner(record))
}

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

	query, args := buildListServiceEventSubscriptionsQuery(listServiceEventSubscriptionsQueryParams{
		WorkspaceID:          "wsp_admin",
		ServiceDefinitionIDs: []string{"app_github", "app_gitea"},
		SubscriptionKind:     "pull_request",
		OwnerMemberID:        "mem_admin",
		OwnerUserID:          "usr_admin",
		WorkspaceWide:        true,
		RequestedLimit:       20,
	})

	require.NotContains(t, query, "subscription.owner_member_id = $")
	require.NotContains(t, query, "creator_agent.id = subscription.created_by_actor_id")
	require.NotContains(t, args, "mem_admin")
	require.NotContains(t, args, "usr_admin")
}

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

	require.True(t, serviceEventSubscriptionWorkspaceManager("owner"))
	require.True(t, serviceEventSubscriptionWorkspaceManager("admin"))
	require.False(t, serviceEventSubscriptionWorkspaceManager("member"))
	require.False(t, serviceEventSubscriptionWorkspaceManager(""))
}
