package opencoderuntime

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

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

func TestPrepareCopiesCredentialsAndModelSelectionIntoIsolatedRuntime(t *testing.T) {
	hostData := t.TempDir()
	hostState := t.TempDir()
	t.Setenv("XDG_DATA_HOME", hostData)
	t.Setenv("XDG_STATE_HOME", hostState)
	writeRuntimeFile(t, filepath.Join(hostData, "opencode", "auth.json"), `{"token":"test"}`)
	writeRuntimeFile(t, filepath.Join(hostState, "opencode", "model.json"), `{"recent":[{"providerID":"openai","modelID":"gpt-test"}]}`)

	workDir := t.TempDir()
	env, err := Prepare(workDir)
	require.NoError(t, err)

	dataHome := envValue(env, "XDG_DATA_HOME")
	stateHome := envValue(env, "XDG_STATE_HOME")
	require.FileExists(t, filepath.Join(dataHome, "opencode", "auth.json"))
	model, err := os.ReadFile(filepath.Join(stateHome, "opencode", "model.json"))
	require.NoError(t, err)
	require.Contains(t, string(model), "gpt-test")
}

func writeRuntimeFile(t *testing.T, path, body string) {
	t.Helper()
	require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o700))
	require.NoError(t, os.WriteFile(path, []byte(body), 0o600))
}

func envValue(env []string, key string) string {
	prefix := key + "="
	for _, entry := range env {
		if len(entry) >= len(prefix) && entry[:len(prefix)] == prefix {
			return entry[len(prefix):]
		}
	}
	return ""
}
