import assert from 'node:assert/strict';
import test from 'node:test';
import { parseConfig } from '../src/config.js';
import { selectBackend } from '../src/backend/select-backend.js';
import type { CommandRunner, RunResult } from '../src/runner.js';

const runner: CommandRunner = {
  async run(): Promise<RunResult> {
    return { exitCode: 0, stdout: Buffer.alloc(0), stderr: Buffer.alloc(0), timedOut: false };
  },
};

test('auto backend selects X11 when X11 is the active session', () => {
  const backend = selectBackend(parseConfig({}), { DISPLAY: ':9', XDG_SESSION_TYPE: 'x11' }, runner);
  assert.equal(backend.constructor.name, 'X11Backend');
});

test('auto backend selects proper Wayland backend for Wayland session', () => {
  const backend = selectBackend(parseConfig({}), { DISPLAY: ':0', WAYLAND_DISPLAY: 'wayland-0', XDG_SESSION_TYPE: 'wayland' }, runner);
  assert.equal(backend.constructor.name, 'WaylandBackend');
});

test('explicit X11 backend remains available for intentional XWayland use', () => {
  const backend = selectBackend(parseConfig({ backend: 'x11' }), { DISPLAY: ':0', XDG_SESSION_TYPE: 'wayland', WAYLAND_DISPLAY: 'wayland-0' }, runner);
  assert.equal(backend.constructor.name, 'X11Backend');
});

test('explicit Wayland backend can be selected independently of DISPLAY', () => {
  const backend = selectBackend(parseConfig({ backend: 'wayland' }), { XDG_SESSION_TYPE: 'wayland', WAYLAND_DISPLAY: 'wayland-1' }, runner);
  assert.equal(backend.constructor.name, 'WaylandBackend');
});
