import 'reflect-metadata';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { StdioTransport } from './inbound/stdio/stdio.transport';

async function bootstrap() {
  const logger: Array<'log' | 'warn' | 'error'> = ['log', 'warn', 'error'];
  const transport = (process.env.MCP_TRANSPORT ?? 'http').toLowerCase();

  if (transport === 'stdio') {
    const app = await NestFactory.createApplicationContext(AppModule, { logger });
    const stdioTransport = app.get(StdioTransport);
    await stdioTransport.start();
    await app.close();
    return;
  }

  const app = await NestFactory.create(AppModule, { logger });
  const port = Number(process.env.MCP_PORT ?? 5000);
  const host = process.env.MCP_HOST ?? '0.0.0.0';

  await app.listen(port, host);
  process.stderr.write(`[mcp] HTTP server listening on http://${host}:${port}/rpc\n`);

  if (transport === 'both') {
    process.stderr.write('[mcp] stdio transport starting (both mode)\n');
    app.get(StdioTransport).start().catch((err: unknown) => {
      const message = err instanceof Error ? err.message : String(err);
      process.stderr.write(`[mcp] stdio error: ${message}\n`);
    });
  }
}

bootstrap().catch((err) => {
  const message = err instanceof Error ? err.stack : String(err);
  process.stderr.write(`${message ?? 'Unknown error'}\n`);
  process.exitCode = 1;
});
