#!/usr/bin/env node
/**
 * dsh — command-line entry. Dynamic imports per mode keep unrelated modes out
 * of each dispatch path; the adapter prints and exits for
 * `--help`/`--version`/a parse error, so only a valid mode reaches the switch.
 * @module @deepseek-ai/dsh/bin
 */

/* v8 ignore file -- built-bin and PTY tests exercise this self-executing dispatch. */

import { readFileSync } from 'node:fs'
import { fileURLToPath } from 'node:url'
import { loadEnv } from '@deepseek-ai/dsh-app-boot'
import { parseDshArgs } from './args.ts'

// Both the source tree (apps/cli/src) and the bundled bin (apps/cli/lib) sit
// one directory under apps/cli, so the checked-in manifest resolves with the
// same relative hop from either artifact.
/** This app's version, read from its checked-in package.json. */
function readVersion(): string {
  const manifest = JSON.parse(
    readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'),
  ) as { version?: unknown }
  return typeof manifest.version === 'string' ? manifest.version : '0.0.0'
}

loadEnv('dsh')
// The env opt-in is read at the process boundary; `1` is the documented value.
const invocation = parseDshArgs(process.argv.slice(2), readVersion(), process.env.DSH_EXPERIMENTAL === '1')

switch (invocation.mode) {
  case 'web': {
    const { runWeb } = await import('./web.ts')
    await runWeb(invocation.host, invocation.port, invocation.dev, invocation.workspaceRoot, invocation.trustedHosts, invocation.config)
    break
  }
  case 'headless': {
    const { runHeadless } = await import('./headless.ts')
    await runHeadless(invocation.prompt)
    break
  }
  case 'tui': {
    const { runTui } = await import('./tui.ts')
    await runTui(invocation.config, invocation.resume, undefined, undefined, invocation.configReplace)
    break
  }
  case 'dump-config': {
    const { runDumpConfig } = await import('./dump-config.ts')
    runDumpConfig(invocation.surface, invocation.defaultOnly, invocation.config)
    break
  }
  case 'meta': {
    const { runTui, SOURCE_ROOT } = await import('./tui.ts')
    await runTui(undefined, undefined, SOURCE_ROOT)
    break
  }
  case 'upgrade': {
    const { runTui } = await import('./tui.ts')
    await runTui(undefined, undefined, undefined, `dsh-${invocation.mode}`)
    break
  }
  default:
    invocation satisfies never
    throw new Error(`dsh: unhandled invocation mode ${JSON.stringify(invocation)}`)
}
