const ffi = require('ffi-napi')
const ref = require('ref-napi')

function buildQuery (query) {
  const buffer = Buffer.from(JSON.stringify(query) + '\0', 'utf-8')
  buffer.type = ref.types.CString
  return buffer
}

const PATH_TO_LIBRARY_FILE = 'libtdjson'

const tdlib = ffi.Library(
  PATH_TO_LIBRARY_FILE,
  {
    'td_json_client_create'          : ['pointer', []],
    'td_json_client_send'            : ['void'   , ['pointer', 'string']],
    'td_json_client_receive'         : ['string' , ['pointer', 'double']],
    'td_json_client_execute'         : ['string' , ['pointer', 'string']],
    'td_json_client_destroy'         : ['void'   , ['pointer']],
    'td_set_log_file_path'           : ['int'    , ['string']],
    'td_set_log_verbosity_level'     : ['void'   , ['int']],
    'td_set_log_fatal_error_callback': ['void'   , ['pointer']]
  }
)

// Create client
const client = tdlib.td_json_client_create()

function send (query) {
  tdlib.td_json_client_send(client, buildQuery(query))
}

function execute (query) {
  return JSON.parse(
    tdlib.td_json_client_execute(client, buildQuery(query))
  )
}

function receive () {
  const timeout = 2
  return JSON.parse(
    tdlib.td_json_client_receive(client, timeout)
  )
}

function destroy () {
  tdlib.td_json_client_destroy(client)
}

// Testing execute
console.log('execute', execute({
  '@type': 'getTextEntities',
  'text': '@telegram /test_command https://telegram.org telegram.me'
}))

// Testing send
send({ '@type': 'getAuthorizationState' })

// Testing receive
console.log('receive', receive())

// Destroy client
destroy()