package agent

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

// P1: daemon turn-state derivation matrix. DerivedTurnState must read only real
// Process/dispatcher queue state (isIdle / inbox / pendingRuntimeInputs / state)
// and report active/queued/idle, never process/status/activity presence.
func TestProcessDerivedTurnStateMatrix(t *testing.T) {
	newProc := func() *Process {
		return &Process{
			processLifecycleState: processLifecycleState{
				state:  processStateRunning,
				isIdle: true,
			},
			processDeliveryState: processDeliveryState{},
		}
	}

	t.Run("running idle empty inbox -> idle", func(t *testing.T) {
		ap := newProc()
		require.Equal(t, types.AgentTurnStateIdle, ap.DerivedTurnState())
	})

	t.Run("live turn (not idle) -> active", func(t *testing.T) {
		ap := newProc()
		ap.isIdle = false
		require.Equal(t, types.AgentTurnStateActive, ap.DerivedTurnState())
	})

	t.Run("inbox queued -> queued", func(t *testing.T) {
		ap := newProc()
		ap.inbox = []types.InboxMessage{{MessageID: "m1"}}
		require.Equal(t, types.AgentTurnStateQueued, ap.DerivedTurnState())
	})

	t.Run("accepted-unacked pending -> queued", func(t *testing.T) {
		ap := newProc()
		ap.pendingRuntimeInputs = map[string]pendingRuntimeInput{
			"in-1": {InflightReason: DeliveryInflightDispatching},
		}
		require.Equal(t, types.AgentTurnStateQueued, ap.DerivedTurnState())
	})

	t.Run("stopping -> idle (recoverable)", func(t *testing.T) {
		ap := newProc()
		ap.stopping = true
		ap.isIdle = false
		ap.inbox = []types.InboxMessage{{MessageID: "m1"}}
		require.Equal(t, types.AgentTurnStateIdle, ap.DerivedTurnState())
	})

	t.Run("stopped -> idle (recoverable)", func(t *testing.T) {
		ap := newProc()
		ap.state = processStateStopped
		ap.isIdle = false
		require.Equal(t, types.AgentTurnStateIdle, ap.DerivedTurnState())
	})

	t.Run("active + inbox both present -> active wins (turn executing)", func(t *testing.T) {
		ap := newProc()
		ap.isIdle = false
		ap.inbox = []types.InboxMessage{{MessageID: "m1"}}
		require.Equal(t, types.AgentTurnStateActive, ap.DerivedTurnState())
	})
}
