package message

import (
	"testing"

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

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

	summary := BuildMessageDeliveryDiagnosticsSummary([]MessageDeliveryDiagnosticsAgent{
		{
			DeliveryStatus: MessageDeliveryStatusTargeted,
			WakeStatus:     MessageDeliveryWakeWouldDeliverRunningAgent,
		},
		{
			DeliveryStatus: MessageDeliveryStatusTargeted,
			WakeStatus:     MessageDeliveryWakeWouldStartAgent,
		},
		{
			DeliveryStatus: MessageDeliveryStatusTargeted,
			WakeStatus:     MessageDeliveryWakeSkippedMachineOffline,
		},
		{
			DeliveryStatus: MessageDeliveryStatusTargeted,
			WakeStatus:     MessageDeliveryWakeSkippedNoWakeSubscription,
		},
		{
			DeliveryStatus: MessageDeliveryStatusExcluded,
			WakeStatus:     MessageDeliveryWakeSkippedNotTargeted,
		},
	})

	require.Equal(t, MessageDeliveryDiagnosticsSummary{
		TargetedAgentCount:      4,
		ExcludedAgentCount:      1,
		WakeDeliverRunningCount: 1,
		WakeStartCount:          1,
		WakeBlockedCount:        2,
	}, summary)
}

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

	require.Equal(t, MessageDeliveryDiagnosticsSummary{}, BuildMessageDeliveryDiagnosticsSummary(nil))
}

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

	summary := BuildMessageDeliveryDiagnosticsSummary([]MessageDeliveryDiagnosticsAgent{
		{
			DeliveryStatus:    MessageDeliveryStatusExcluded,
			OwnerPrivateState: MessageDeliveryOwnerPrivateStateOwnerQuoteRequired,
			WakeStatus:        MessageDeliveryWakeSkippedNotTargeted,
		},
	})

	require.True(t, summary.OwnerPrivateRequired)
}

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

	first := boolPointer(true)
	second := boolPointer(false)
	require.True(t, *first)
	require.False(t, *second)
}

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

	require.Equal(t, "thinking", normalizeDeliverySummaryActivity("thinking", "active"))
	require.Equal(t, "online", normalizeDeliverySummaryActivity("sleeping", "active"))
	require.Equal(t, "working", normalizeDeliverySummaryActivity("", "active"))
	require.Equal(t, "offline", normalizeDeliverySummaryActivity("", "offline"))
}
