package uisession

import (
	"testing"
	"time"

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

// TestAdvanceServerGenerationEmitsAdvancedToSubscribedSessions covers
// P4-BE-09: AdvanceServerGeneration(S1) emits Change{Kind:Advanced,
// Generation:G+1} on sessions subscribed to S1; sessions on S2 see nothing.
func TestAdvanceServerGenerationEmitsAdvancedToSubscribedSessions(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 sessionA = "session-advance-a"
	const sessionB = "session-advance-b"

	_, err := store.Select(sessionA, expiresAt, "server-1")
	require.NoError(t, err)
	_, err = store.Select(sessionB, expiresAt, "server-2")
	require.NoError(t, err)

	subA, err := store.Subscribe(sessionA, expiresAt)
	require.NoError(t, err)
	subB, err := store.Subscribe(sessionB, expiresAt)
	require.NoError(t, err)

	require.Equal(t, 1, store.AdvanceServerGeneration("server-1"))

	select {
	case change := <-subA.Changes:
		require.Equal(t, ChangeKindAdvanced, change.Kind)
		require.Equal(t, uint64(2), change.Generation)
	default:
		t.Fatal("sessionA subscribed to server-1 MUST observe an Advanced Change")
	}

	select {
	case _, ok := <-subB.Changes:
		if ok {
			t.Fatal("sessionB subscribed to server-2 MUST NOT observe an Advanced for server-1")
		}
	default:
		// no event — expected.
	}

	if subA.Release != nil {
		subA.Release()
	}
	if subB.Release != nil {
		subB.Release()
	}
}
