package uisession

import (
	"testing"
	"time"

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

// TestReleaseDecrementsSubscriberCountAndClosesChannel covers P4-BE-06:
// Release decrements the Store's internal subscriber count, is idempotent,
// closes the channel, and prevents post-release delivery.
func TestReleaseDecrementsSubscriberCountAndClosesChannel(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-release"
	sub, err := store.Subscribe(sessionID, expiresAt)
	require.NoError(t, err)
	require.Equal(t, 1, subscriberCountLocked(store, sessionID))

	sub.Release()
	require.Equal(t, 0, subscriberCountLocked(store, sessionID))

	// Second Release is idempotent.
	sub.Release()
	require.Equal(t, 0, subscriberCountLocked(store, sessionID))

	// Channel is closed after release.
	select {
	case _, ok := <-sub.Changes:
		require.False(t, ok, "Changes must be closed after Release")
	case <-time.After(time.Second):
		t.Fatal("Changes channel receive blocked — Release did not close the channel")
	}

	// Post-release delivery is forbidden: a Select MUST NOT deliver a Change.
	_, selectErr := store.Select(sessionID, expiresAt, "server-post-release")
	require.NoError(t, selectErr)

	select {
	case _, ok := <-sub.Changes:
		require.False(t, ok, "post-release Select MUST NOT deliver")
	default:
		// Channel is closed AND empty — no value to receive, no block.
	}
}
