package testutil

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

// TempDirInMemory creates a temporary directory that preferentially uses
// in-memory filesystems (tmpfs/ramdisk) when available. This reduces I/O
// overhead for git-heavy tests.
//
// On Linux: Uses /dev/shm if available (tmpfs ramdisk)
// On macOS: Falls back to standard temp (ramdisks require manual setup)
// On Windows: Falls back to standard temp
//
// The directory is automatically cleaned up when the test ends.
func TempDirInMemory(t testing.TB) string {
	t.Helper()

	var baseDir string
	
	switch runtime.GOOS {
	case "linux":
		// Try /dev/shm (tmpfs ramdisk) first
		if stat, err := os.Stat("/dev/shm"); err == nil && stat.IsDir() {
			// Create subdirectory with proper permissions
			tmpBase := filepath.Join("/dev/shm", "beads-test")
			if err := os.MkdirAll(tmpBase, 0755); err == nil {
				baseDir = tmpBase
			}
		}
	case "darwin":
		// macOS: /tmp might already be on APFS with fast I/O
		// Creating a ramdisk requires sudo, so we rely on system defaults
		// Users can manually mount /tmp as tmpfs if needed:
		// diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000`
		baseDir = os.TempDir()
	default:
		// Windows and others: use standard temp
		baseDir = os.TempDir()
	}

	// If we didn't set baseDir (e.g., /dev/shm unavailable), use default
	if baseDir == "" {
		baseDir = os.TempDir()
	}

	// Create unique temp directory
	tmpDir, err := os.MkdirTemp(baseDir, "beads-test-*")
	if err != nil {
		t.Fatalf("Failed to create temp dir: %v", err)
	}

	// Register cleanup
	t.Cleanup(func() {
		_ = os.RemoveAll(tmpDir)
	})

	return tmpDir
}
