package uisession

import (
	"testing"
	"time"

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

// TestStaleCleanupDoesNotClearReselectedSession covers P4-BE-16: a stale
// InvalidateServer(S_old) after the session has reselected to S_new leaves
// the current selection intact.
func TestStaleCleanupDoesNotClearReselectedSession(t *testing.T) {
	now := time.Date(2026, 7, 16, 0, 0, 0, 0, time.UTC)
	store := NewStore(Options{Now: func() time.Time { return now }})
	expiresAt := now.Add(time.Hour)

	const sessionID = "session-stale-cleanup"
	const sOld = "server-old"
	const sNew = "server-new"

	_, err := store.Select(sessionID, expiresAt, sOld)
	require.NoError(t, err)
	_, err = store.Select(sessionID, expiresAt, sNew)
	require.NoError(t, err)

	sub, err := store.Subscribe(sessionID, expiresAt)
	require.NoError(t, err)

	require.Equal(t, 0, store.AdvanceServerGeneration(sOld))
	require.Equal(t, 0, store.InvalidateServer(sOld))

	current, ok := store.Get(sessionID)
	require.True(t, ok)
	require.Equal(t, sNew, current.ActiveServerID)
	require.Equal(t, uint64(2), current.Generation)

	select {
	case _, ok := <-sub.Changes:
		if ok {
			t.Fatal("stale InvalidateServer(S_old) MUST NOT deliver to a session already on S_new")
		}
	default:
		// no event — expected.
	}

	if sub.Release != nil {
		sub.Release()
	}
}
