package agent

import (
	"testing"

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

func TestProcessCurrentTurnMessageIDDedicatedField(t *testing.T) {
	ap := &Process{
		processWakeState: processWakeState{
			currentTurnMessageID: "msg-dedicated",
		},
	}
	require.Equal(t, "msg-dedicated", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDFallsBackToPendingWake(t *testing.T) {
	wake := &pendingDelivery{Wake: WakeInfo{MessageID: "msg-wake"}, Status: pendingDeliveryAwaitingCheck}
	ap := &Process{
		processWakeState: processWakeState{
			pendingWake: wake,
		},
	}
	require.Equal(t, "msg-wake", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDFallsBackToTransientRetry(t *testing.T) {
	ap := &Process{
		processRuntimeFailureState: processRuntimeFailureState{
			transientRuntimeRetry: transientRuntimeRetryState{MessageID: "msg-transient"},
		},
	}
	require.Equal(t, "msg-transient", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDDedicatedFieldTakesPriority(t *testing.T) {
	wake := &pendingDelivery{Wake: WakeInfo{MessageID: "msg-wake"}, Status: pendingDeliveryAwaitingCheck}
	ap := &Process{
		processWakeState: processWakeState{
			currentTurnMessageID: "msg-dedicated",
			pendingWake:          wake,
		},
		processRuntimeFailureState: processRuntimeFailureState{
			transientRuntimeRetry: transientRuntimeRetryState{MessageID: "msg-transient"},
		},
	}
	require.Equal(t, "msg-dedicated", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDEmptyWhenNothingSet(t *testing.T) {
	ap := &Process{}
	require.Equal(t, "", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDNilSafe(t *testing.T) {
	var ap *Process
	require.Equal(t, "", ap.CurrentTurnMessageID())
}

func TestProcessCurrentTurnMessageIDUpdatedOnDeliveryActivation(t *testing.T) {
	ap := &Process{
		processWakeState: processWakeState{
			currentTurnMessageID: "old-msg",
		},
	}
	ap.mu.Lock()
	ap.activatePendingDeliveryLocked(pendingDelivery{
		Wake:  WakeInfo{MessageID: "new-msg"},
		Token: "token",
	})
	ap.mu.Unlock()
	require.Equal(t, "new-msg", ap.CurrentTurnMessageID())
}
