package dispatcher

import (
	"fmt"
	"os"
	"testing"

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

// TestSessionResumeStateSaveFailsClosedOnUnknownOwnershipVersionWithEmptyRecords
// guards the gap Reviewer3 flagged: saveUnlocked previously only rejected an
// unknown non-zero ownership version when len(RuntimeDeliveryOwnership) > 0, so
// an unrelated resume-state Update could rewrite a future-schema state whose
// payload was empty or undecodable and silently lose the version marker.
func TestSessionResumeStateSaveFailsClosedOnUnknownOwnershipVersionWithEmptyRecords(t *testing.T) {
	workDir := t.TempDir()
	const futureVersion = retiredRuntimeDeliveryOwnershipVersion + 1
	require.NoError(t, os.WriteFile(sessionResumeStatePath(workDir), []byte(fmt.Sprintf(
		`{"lastSessionId":"thread-future","runtimeDeliveryOwnershipVersion":%d}`, futureVersion)), 0o600))

	store := &sessionResumeStateStore{}
	err := store.Update(workDir, func(state *sessionResumeState) error {
		state.LastSessionID = "thread-updated"
		return nil
	})
	require.Error(t, err)
	require.Contains(t, err.Error(), "unsupported runtime delivery ownership version")

	// The future-version state must remain intact on disk: no rewrite, no loss.
	data, readErr := os.ReadFile(sessionResumeStatePath(workDir))
	require.NoError(t, readErr)
	require.Contains(t, string(data), fmt.Sprintf(`"runtimeDeliveryOwnershipVersion":%d`, futureVersion))
	require.Contains(t, string(data), "thread-future")
	require.NotContains(t, string(data), "thread-updated")
}

// TestSessionResumeStateSaveAllowsZeroVersionWithEmptyRecords confirms the
// unconditional version check does not regress the normal no-ownership case.
func TestSessionResumeStateSaveAllowsZeroVersionWithEmptyRecords(t *testing.T) {
	workDir := t.TempDir()
	store := &sessionResumeStateStore{}
	require.NoError(t, store.Save(workDir, sessionResumeState{LastSessionID: "thread-clean"}))
	data, err := os.ReadFile(sessionResumeStatePath(workDir))
	require.NoError(t, err)
	require.Contains(t, string(data), "thread-clean")
}
