package agent

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/alertstore/pkg/alert"
)

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

	outcomes, rate, scoreable := pivotVerdictRows([]verdictRow{
		{Verdict: VerdictNoise, State: alert.StateResolved, Resolution: alert.ResolutionNoise, Count: 6},
		{Verdict: VerdictNoise, State: alert.StateResolved, Resolution: alert.ResolutionHandled, Count: 2},
		{Verdict: VerdictNoise, State: alert.StateResolved, Resolution: alert.ResolutionExpired, Count: 3},
		{Verdict: VerdictNoise, State: alert.StateAcked, Resolution: "", Count: 1},
		{Verdict: VerdictEscalation, State: alert.StateResolved, Resolution: alert.ResolutionHandled, Count: 4},
		{Verdict: VerdictEscalation, State: alert.StateResolved, Resolution: alert.ResolutionSelfRecovered, Count: 1},
		{Verdict: VerdictUnknown, State: alert.StateResolved, Resolution: alert.ResolutionNoise, Count: 5},
		{Verdict: VerdictMitigated, State: alert.StateResolved, Resolution: alert.ResolutionHandled, Count: 2},
		{Verdict: "likely_noise", State: alert.StateResolved, Resolution: alert.ResolutionNoise, Count: 9},
	})

	require.Equal(t, []VerdictOutcome{
		{Verdict: VerdictNoise, Handled: 2, Noise: 6, Expired: 3, Open: 1, Total: 12},
		{Verdict: VerdictSelfRecovered},
		{Verdict: VerdictMitigated, Handled: 2, Total: 2},
		{Verdict: VerdictEscalation, Handled: 4, SelfRecovered: 1, Total: 5},
		{Verdict: VerdictUnknown, Noise: 5, Total: 5},
	}, outcomes)

	// scoreable: noise 6+2, escalation 4+1; agreed: 6 + 4
	require.Equal(t, 13, scoreable)
	require.NotNil(t, rate)
	require.InDelta(t, 10.0/13.0, *rate, 1e-9)
}

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

	outcomes, rate, scoreable := pivotVerdictRows([]verdictRow{
		{Verdict: VerdictUnknown, State: alert.StateResolved, Resolution: alert.ResolutionHandled, Count: 3},
		{Verdict: VerdictNoise, State: alert.StateOpen, Count: 2},
	})
	require.Len(t, outcomes, 5)
	require.Nil(t, rate)
	require.Zero(t, scoreable)
}

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

	got := pivotRunRows([]runRow{
		{Status: StatusSucceeded, Count: 40},
		{Status: StatusFailed, Count: 3},
		{Status: StatusDispatched, Count: 2},
		{Status: StatusRunning, Count: 1},
		{Status: "bogus", Count: 7},
	})
	require.Equal(t, RunCounts{Dispatched: 2, Running: 1, Succeeded: 40, Failed: 3}, got)
}
