package dispatcher

import (
	"encoding/json"
	"os"
	"path/filepath"
	"testing"

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

// A prerelease v2 journal may contain the short-lived "acked" outcome.
// Loading it must succeed, report the record as acknowledged, and rewrite the
// frozen "surfaced" spelling on the next save.
func TestAlternateV2AckedOutcomeLoadsAndRewritesFrozenSpelling(t *testing.T) {
	workDir := t.TempDir()
	state := map[string]any{
		"runtimeDeliveryOwnershipVersion": 2,
		"runtimeDeliveryOwnership": []map[string]any{{
			"message": map[string]any{"message_id": "m-alternate", "target": "#ops"},
			"input":   map[string]any{"ID": "m-alternate"},
			"state":   "terminal",
			"outcome": "acked",
		}},
	}
	blob, err := json.Marshal(state)
	require.NoError(t, err)
	require.NoError(t, os.WriteFile(filepath.Join(workDir, ".daemon-state.json"), blob, 0o644))

	store := newSessionDeliveryOwnershipStore(workDir)
	records, err := store.LoadDeliveryOwnership()
	require.NoError(t, err)
	require.Len(t, records, 1)
	require.True(t, records[0].IsAcked())
	_, err = store.PutDeliveryOwnership(records[0])
	require.NoError(t, err)

	rewritten, err := os.ReadFile(filepath.Join(workDir, ".daemon-state.json"))
	require.NoError(t, err)
	require.Contains(t, string(rewritten), `"outcome":"surfaced"`)
	require.NotContains(t, string(rewritten), `"outcome":"acked"`)
}
