import type { ChatGptComputerMcpConfig } from '../config.js';
import { computerError } from '../errors.js';
import type { CommandRunner } from '../runner.js';
import { SpawnCommandRunner } from '../runner.js';
import type { ComputerBackend } from './computer-backend.js';
import { WaylandBackend } from './wayland.js';
import { X11Backend } from './x11.js';

export function selectBackend(
  config: Readonly<ChatGptComputerMcpConfig>,
  env: NodeJS.ProcessEnv = process.env,
  runner: CommandRunner = new SpawnCommandRunner(),
): ComputerBackend {
  if (process.platform !== 'linux') {
    throw computerError('UNSUPPORTED_PLATFORM', 'backend.select', 'chatgpt-computer-mcp supports Linux only.');
  }

  if (config.backend === 'x11') return new X11Backend(config, runner, env);
  if (config.backend === 'wayland') return new WaylandBackend(config, undefined);

  const session = (env.XDG_SESSION_TYPE ?? '').toLowerCase();
  if (session === 'wayland' || env.WAYLAND_DISPLAY !== undefined) return new WaylandBackend(config, undefined);
  if (env.DISPLAY !== undefined) return new X11Backend(config, runner, env);

  throw computerError('BACKEND_UNAVAILABLE', 'backend.select', 'No supported graphical session detected. X11 requires DISPLAY; Wayland requires a portal-capable Wayland session.');
}
