const
SocketDispatcher  = require('./dispatcher'),
SocketEmitter     = require('./emitter'),
SocketContext     = require('./context')

class SocketConnection
{
  constructor(log)
  {
    this.log        = log
    this.dispatcher = new SocketDispatcher(log)
    this.emitter    = new SocketEmitter(log)
  }

  onConnection(socket)
  {
    this.logSocketEvents(socket, this.log)
    const context = new SocketContext(socket, this.emitter)
    this.attachDataEventToDispatcherWithAContext(socket, this.dispatcher, context)
  }

  /**
   * @protected
   */
  logSocketEvents(socket, log)
  {
    for(const event of ['close','connection','drain','end','lookup','timeout'])
      socket.on(event, () => log.info('connection:', event))

    for(const event of ['error'])
      socket.on(event, (...a) => log.info('connection:', event, ...a))
  }

  /**
   * @protected
   */
  attachDataEventToDispatcherWithAContext(socket, dispatcher, context)
  {
    socket.on('data', dispatcher.dispatch.bind(dispatcher, context))
  }
}

module.exports = SocketConnection