package coredeno

import (
	"os"
	"testing"

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

func TestNewSidecar_Good(t *testing.T) {
	opts := Options{
		DenoPath:   "echo",
		SocketPath: "/tmp/test-core-deno.sock",
	}
	sc := NewSidecar(opts)
	require.NotNil(t, sc)
	assert.Equal(t, "echo", sc.opts.DenoPath)
	assert.Equal(t, "/tmp/test-core-deno.sock", sc.opts.SocketPath)
}

func TestDefaultSocketPath_Good(t *testing.T) {
	path := DefaultSocketPath()
	assert.Contains(t, path, "core/deno.sock")
}

func TestSidecar_PermissionFlags_Good(t *testing.T) {
	perms := Permissions{
		Read:  []string{"./data/"},
		Write: []string{"./data/config.json"},
		Net:   []string{"pool.lthn.io:3333"},
		Run:   []string{"xmrig"},
	}
	flags := perms.Flags()
	assert.Contains(t, flags, "--allow-read=./data/")
	assert.Contains(t, flags, "--allow-write=./data/config.json")
	assert.Contains(t, flags, "--allow-net=pool.lthn.io:3333")
	assert.Contains(t, flags, "--allow-run=xmrig")
}

func TestSidecar_PermissionFlags_Empty(t *testing.T) {
	perms := Permissions{}
	flags := perms.Flags()
	assert.Empty(t, flags)
}

func TestOptions_AppRoot_Good(t *testing.T) {
	opts := Options{
		DenoPath:    "deno",
		SocketPath:  "/tmp/test.sock",
		AppRoot:     "/app",
		StoreDBPath: "/app/.core/store.db",
	}
	sc := NewSidecar(opts)
	assert.Equal(t, "/app", sc.opts.AppRoot)
	assert.Equal(t, "/app/.core/store.db", sc.opts.StoreDBPath)
}

func TestOptions_StoreDBPath_Default_Good(t *testing.T) {
	opts := Options{AppRoot: "/app"}
	sc := NewSidecar(opts)
	assert.Equal(t, "/app/.core/store.db", sc.opts.StoreDBPath,
		"StoreDBPath should default to AppRoot/.core/store.db")
}

func TestOptions_SidecarArgs_Good(t *testing.T) {
	opts := Options{
		DenoPath:    "deno",
		SidecarArgs: []string{"run", "--allow-env", "main.ts"},
	}
	sc := NewSidecar(opts)
	assert.Equal(t, []string{"run", "--allow-env", "main.ts"}, sc.opts.SidecarArgs)
}

func TestDefaultSocketPath_XDG(t *testing.T) {
	orig := os.Getenv("XDG_RUNTIME_DIR")
	defer os.Setenv("XDG_RUNTIME_DIR", orig)

	os.Setenv("XDG_RUNTIME_DIR", "/run/user/1000")
	path := DefaultSocketPath()
	assert.Equal(t, "/run/user/1000/core/deno.sock", path)
}

func TestOptions_DenoSocketPath_Default_Good(t *testing.T) {
	opts := Options{SocketPath: "/tmp/core/core.sock"}
	sc := NewSidecar(opts)
	assert.Equal(t, "/tmp/core/deno.sock", sc.opts.DenoSocketPath,
		"DenoSocketPath should default to same dir as SocketPath with deno.sock")
}

func TestOptions_DenoSocketPath_Explicit_Good(t *testing.T) {
	opts := Options{
		SocketPath:     "/tmp/core/core.sock",
		DenoSocketPath: "/tmp/custom/deno.sock",
	}
	sc := NewSidecar(opts)
	assert.Equal(t, "/tmp/custom/deno.sock", sc.opts.DenoSocketPath,
		"Explicit DenoSocketPath should not be overridden")
}
