import { createServer, Socket } from 'net';
import { GDBConnection } from './gdb-connection';
import { GDBServer } from './gdb-server';
import { RP2040 } from '../rp2040';

export class GDBTCPServer extends GDBServer {
  private socketServer = createServer();

  constructor(rp2040: RP2040, readonly port: number = 3333) {
    super(rp2040);
    this.socketServer.listen(port);
    this.socketServer.on('connection', (socket) => this.handleConnection(socket));
  }

  handleConnection(socket: Socket) {
    this.info('GDB connected');
    socket.setNoDelay(true);

    const connection = new GDBConnection(this, (data) => {
      socket.write(data);
    });

    socket.on('data', (data) => {
      connection.feedData(data.toString('utf-8'));
    });

    socket.on('error', (err) => {
      this.removeConnection(connection);
      this.error(`GDB socket error ${err}`);
    });

    socket.on('close', () => {
      this.removeConnection(connection);
      this.info('GDB disconnected');
    });
  }
}