Net = require('net')

Base = require('../base')
Connector = require('./connector')
Publisher = require('./publisher')

debug = Base.logger('polyglot_relay')

SOCKET_CONFIG = null


exports.start = (socketDef) ->
  socketOpts = socketDef.split(':')
  type = socketOpts.shift()
  if type == 'unix'
    startUnixSocket(socketOpts[0])
  else
    startTcpSocket(socketOpts[0], socketOpts[1])

startTcpSocket = (host, port) ->
  SOCKET_CONFIG = { allowHalfOpen: true, host: host, port: port }
  startSocket()

startUnixSocket = (socketPath) ->
  SOCKET_CONFIG = { allowHalfOpen: true, path: socketPath }
  startSocket()

startSocket = ->
  debug('start', SOCKET_CONFIG)
  exportsInfoJson = ''
  client = Net.connect SOCKET_CONFIG, ->
    debug('connected to relay')
    client.end(JSON.stringify({ IX_DIR: Base.env.IX_DIR }))
  client.on 'data', (info) ->
    exportsInfoJson += info.toString()
  client.on 'end', ->
    exportsInfo = JSON.parse(exportsInfoJson)
    debug('exportsInfo', exportsInfo)
    Publisher.publishExportsAndGetProxy(exportsInfo)
    .then (data) ->
      Connector.connectRelayToProxy(data)

exports.invoker = (callData, cb_err_data) ->
  debug('invoker', callData)
  errDataJson = ''
  relay = Net.connect SOCKET_CONFIG, ->
    relay.end(JSON.stringify(callData))
  relay.on 'data', (data) ->
    errDataJson += data.toString()
  relay.on 'end', ->
    errData = JSON.parse(errDataJson)
    debug('errData', errData)
    cb_err_data(errData.err, errData.data)
  relay.on 'error', (err) ->
    debug('error', err)
    cb_err_data(err)
