/**
 * desktop/src/server-config.ts — build the env overrides fed to the backend's
 * loadConfig() for the embedded server.
 *
 * Starts from a COPY of the ambient env (never mutates it) and pins the four
 * values the desktop shell controls: PORT (the free port we already resolved),
 * BIND_HOST (private 127.0.0.1 by default; 0.0.0.0 only when LAN sharing is on),
 * SHELL_PATH (platform-aware default so Windows gets PowerShell), and USE_TMUX
 * (forced off on Windows — tmux is a *nix keepalive; elsewhere respect the
 * ambient env, defaulting off). Every other ambient var passes through untouched.
 */

import type { DesktopPrefs } from './types.js'
import { defaultShellForPlatform } from './shell.js'

/** Loopback bind host — private mode; the window connects here and always passes Origin checks. */
const PRIVATE_BIND_HOST = '127.0.0.1'
/** Wildcard bind host — LAN sharing (phones/tablets reconnect); opt-in, no auth. */
const LAN_BIND_HOST = '0.0.0.0'
/** tmux keepalive is a *nix feature; the desktop shell defaults it off (and forces off on Windows). */
const TMUX_OFF = '0'

export interface ServerEnvInput {
  readonly prefs: DesktopPrefs
  readonly port: number
  readonly platform: NodeJS.Platform
  readonly env: NodeJS.ProcessEnv
}

/**
 * Produce the env-override object for loadConfig(). Immutable: input.env is
 * spread into a NEW object and is never mutated.
 */
export function buildServerEnv(input: ServerEnvInput): Record<string, string | undefined> {
  const { prefs, port, platform, env } = input
  return {
    ...env,
    PORT: String(port),
    BIND_HOST: prefs.lanSharing ? LAN_BIND_HOST : PRIVATE_BIND_HOST,
    SHELL_PATH: prefs.shellPath ?? defaultShellForPlatform(platform, env),
    USE_TMUX: platform === 'win32' ? TMUX_OFF : (env.USE_TMUX ?? TMUX_OFF),
  }
}
