package app

import (
	"os"
	"testing"

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

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

	sourceBytes, err := os.ReadFile("owner_private_mentions.go")
	require.NoError(t, err)
	source := string(sourceBytes)

	require.Contains(t, source, "FROM scopes host_scope")
	require.Contains(t, source, "JOIN scope_memberships sm")
	require.Contains(t, source, "scope_notification_settings")
	require.Contains(t, source, "thread_context.archived_at IS NULL")
	require.Contains(t, source, "thread_context.effective_to_seq IS NULL")
	require.Contains(t, source, "author_private_entry.archived_at IS NULL")
	require.Contains(t, source, "author_private_entry.effective_to_seq IS NULL")
	require.Contains(t, source, "author_private_entry.authority_from_at")
	require.Contains(t, source, "author_owner_member.user_id")
	require.Contains(t, source, "sm.archived_at IS NULL")
	require.Contains(t, source, "sm.effective_to_seq IS NULL")
	require.Contains(t, source, "sm.authority_from_at")
	require.Contains(t, source, "host_scope.status = 'active'")
	require.Contains(t, source, "mac.created_by_user_id = target_owner_member.user_id")
}

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

	targetBytes, err := os.ReadFile("agent_target_basis.go")
	require.NoError(t, err)
	targetSource := string(targetBytes)

	require.Contains(t, targetSource, "FROM scopes s")
	require.Contains(t, targetSource, "JOIN scope_channel_profiles p")
	require.Contains(t, targetSource, "FROM scope_memberships sm")
	require.Contains(t, targetSource, "sm.visibility IN ('public', 'private')")
	require.Contains(t, targetSource, "sm.owner_member_id = owner_member.id")
	require.Contains(t, targetSource, "resolveExistingAgentChannelReplyThreadTarget")
	require.NotContains(t, targetSource, "RequireOwnerPrivateContextRecordVisible")
}

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

	for _, path := range []string{"service_event_target_contract.go", "service_event_delivery_target.go"} {
		sourceBytes, err := os.ReadFile(path)
		require.NoError(t, err)
		source := string(sourceBytes)

		require.Contains(t, source, "scope_memberships")
		if path == "service_event_target_contract.go" {
			require.Contains(t, source, "execution_owner_member_id")
			require.Contains(t, source, "NULLIF(t.execution_owner_member_id, '')")
		}
	}
}

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

	sourceBytes, err := os.ReadFile("app_messages.go")
	require.NoError(t, err)
	source := string(sourceBytes)

	require.Contains(t, source, "scope_memberships")
	require.Contains(t, source, "scope_notification_settings")
}

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

	sourceBytes, err := os.ReadFile("task_source_thread_context.go")
	require.NoError(t, err)
	source := string(sourceBytes)

	require.Contains(t, source, "CanReadVisibleScopesForAgent")
	require.Contains(t, source, "FROM scopes source_scope")
	require.Contains(t, source, "JOIN scopes parent_scope")
	require.Contains(t, source, "JOIN scope_messages root_message")
}

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

	sourceBytes, err := os.ReadFile("service_event_delivery_target.go")
	require.NoError(t, err)
	source := string(sourceBytes)

	require.Contains(t, source, "FROM scopes thread_scope")
	require.Contains(t, source, "JOIN scopes parent_scope")
	require.Contains(t, source, "LEFT JOIN scope_channel_profiles parent_profile")
}
