import { Injectable } from '@nestjs/common';
import { createInterface } from 'readline';
import { McpRequestHandler } from '../mcp/mcp-request-handler.service';
import { createErrorResponse } from '../../shared/mcp/jsonrpc.types';

@Injectable()
export class StdioTransport {
  constructor(private readonly requestHandler: McpRequestHandler) {}

  async start(): Promise<void> {
    process.stderr.write('[mcp] stdio transport started\n');

    const readline = createInterface({
      input: process.stdin,
      crlfDelay: Infinity,
      terminal: false,
    });

    for await (const line of readline) {
      const payload = line.trim();
      if (!payload) {
        continue;
      }

      let body: unknown;
      try {
        body = JSON.parse(payload);
      } catch {
        const response = createErrorResponse(null, -32700, 'Parse error');
        process.stdout.write(`${JSON.stringify(response)}\n`);
        continue;
      }

      const response = await this.requestHandler.handle(body);
      if (response) {
        process.stdout.write(`${JSON.stringify(response)}\n`);
      }
    }
  }
}
