package migrations

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

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

func TestMigrateIdentityDocuments(t *testing.T) {
	t.Run("moves root identity and creates Cloud Memory directories", func(t *testing.T) {
		dir := t.TempDir()
		require.NoError(t, os.WriteFile(filepath.Join(dir, "IDENTITY.md"), []byte("# Identity\n"), 0o644))
		changed, err := MigrateIdentityDocuments(dir)
		require.NoError(t, err)
		require.True(t, changed)
		content, err := os.ReadFile(filepath.Join(dir, "memory", "system", "identity.md"))
		require.NoError(t, err)
		require.Equal(t, "# Identity\n", string(content))
		require.NoFileExists(t, filepath.Join(dir, "IDENTITY.md"))
		changed, err = MigrateIdentityDocuments(dir)
		require.NoError(t, err)
		require.False(t, changed)
	})

	t.Run("prefers root identity when both sources exist", func(t *testing.T) {
		dir := t.TempDir()
		require.NoError(t, os.WriteFile(filepath.Join(dir, "IDENTITY.md"), []byte("current"), 0o644))
		require.NoError(t, os.WriteFile(filepath.Join(dir, rootIdentityPaths[1]), []byte("older"), 0o644))
		changed, err := MigrateIdentityDocuments(dir)
		require.NoError(t, err)
		require.True(t, changed)
		require.Equal(t, "current", string(mustReadIdentity(t, dir)))
		require.NoFileExists(t, filepath.Join(dir, "IDENTITY.md"))
		require.NoFileExists(t, filepath.Join(dir, rootIdentityPaths[1]))
	})

	t.Run("keeps non-empty Cloud Memory target and removes both sources", func(t *testing.T) {
		dir := t.TempDir()
		require.NoError(t, os.MkdirAll(filepath.Join(dir, "memory", "system"), 0o755))
		require.NoError(t, os.WriteFile(filepath.Join(dir, "IDENTITY.md"), []byte("local"), 0o644))
		require.NoError(t, os.WriteFile(filepath.Join(dir, rootIdentityPaths[1]), []byte("old"), 0o644))
		target := filepath.Join(dir, "memory", "system", "identity.md")
		require.NoError(t, os.WriteFile(target, []byte("canonical"), 0o644))
		changed, err := MigrateIdentityDocuments(dir)
		require.NoError(t, err)
		require.True(t, changed)
		content, err := os.ReadFile(target)
		require.NoError(t, err)
		require.Equal(t, "canonical", string(content))
		require.NoFileExists(t, filepath.Join(dir, "IDENTITY.md"))
		require.NoFileExists(t, filepath.Join(dir, rootIdentityPaths[1]))
	})

	t.Run("fills an empty Cloud Memory target", func(t *testing.T) {
		dir := t.TempDir()
		require.NoError(t, os.MkdirAll(filepath.Join(dir, "memory", "system"), 0o755))
		require.NoError(t, os.WriteFile(filepath.Join(dir, "memory", "system", "identity.md"), []byte(" \n"), 0o644))
		require.NoError(t, os.WriteFile(filepath.Join(dir, rootIdentityPaths[1]), []byte("migrated"), 0o644))
		changed, err := MigrateIdentityDocuments(dir)
		require.NoError(t, err)
		require.True(t, changed)
		require.Equal(t, "migrated", string(mustReadIdentity(t, dir)))
	})
}

func mustReadIdentity(t *testing.T, dir string) []byte {
	t.Helper()
	content, err := os.ReadFile(filepath.Join(dir, "memory", "system", "identity.md"))
	require.NoError(t, err)
	return content
}
