package uisession

import (
	"testing"
	"time"

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

// TestReconnectSnapshotMatchesAuthoritativeState covers P4-BE-11: a
// subscriber that releases then re-subscribes sees a snapshot consistent
// with the current store, not a replay of stale events.
func TestReconnectSnapshotMatchesAuthoritativeState(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-reconnect"

	first, err := store.Subscribe(sessionID, expiresAt)
	require.NoError(t, err)
	require.Equal(t, SubscriptionStateEmpty, first.Snapshot.State)
	first.Release()

	_, err = store.Select(sessionID, expiresAt, "server-1")
	require.NoError(t, err)
	_, ok := store.Clear(sessionID)
	require.True(t, ok)
	_, err = store.Select(sessionID, expiresAt, "server-3")
	require.NoError(t, err)

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

	require.Equal(t, SubscriptionStateSelected, second.Snapshot.State)
	require.Equal(t, "server-3", second.Snapshot.ActiveServerID)
	require.Equal(t, uint64(3), second.Snapshot.Generation)
	require.Equal(t, uint64(3), second.Snapshot.Revision)

	select {
	case _, ok := <-second.Changes:
		if ok {
			t.Fatal("Reconnect snapshot MUST be followed by an empty Change channel — no replay")
		}
	default:
		// empty — expected.
	}

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