'use strict'
require('./test-helper')
const BufferList = require('./buffer-list')
// http://developer.postgresql.org/pgdocs/postgres/protocol-message-formats.html

var buffers = {}
buffers.readyForQuery = function () {
  return new BufferList().add(Buffer.from('I')).join(true, 'Z')
}

buffers.authenticationOk = function () {
  return new BufferList().addInt32(0).join(true, 'R')
}

buffers.authenticationCleartextPassword = function () {
  return new BufferList().addInt32(3).join(true, 'R')
}

buffers.authenticationMD5Password = function () {
  return new BufferList()
    .addInt32(5)
    .add(Buffer.from([1, 2, 3, 4]))
    .join(true, 'R')
}

buffers.authenticationSASL = function () {
  return new BufferList().addInt32(10).addCString('SCRAM-SHA-256').addCString('').join(true, 'R')
}

buffers.authenticationSASLContinue = function () {
  return new BufferList().addInt32(11).addString('data').join(true, 'R')
}

buffers.authenticationSASLFinal = function () {
  return new BufferList().addInt32(12).addString('data').join(true, 'R')
}

buffers.parameterStatus = function (name, value) {
  return new BufferList().addCString(name).addCString(value).join(true, 'S')
}

buffers.backendKeyData = function (processID, secretKey) {
  return new BufferList().addInt32(processID).addInt32(secretKey).join(true, 'K')
}

buffers.commandComplete = function (string) {
  return new BufferList().addCString(string).join(true, 'C')
}

buffers.rowDescription = function (fields) {
  fields = fields || []
  var buf = new BufferList()
  buf.addInt16(fields.length)
  fields.forEach(function (field) {
    buf
      .addCString(field.name)
      .addInt32(field.tableID || 0)
      .addInt16(field.attributeNumber || 0)
      .addInt32(field.dataTypeID || 0)
      .addInt16(field.dataTypeSize || 0)
      .addInt32(field.typeModifier || 0)
      .addInt16(field.formatCode || 0)
  })
  return buf.join(true, 'T')
}

buffers.dataRow = function (columns) {
  columns = columns || []
  var buf = new BufferList()
  buf.addInt16(columns.length)
  columns.forEach(function (col) {
    if (col == null) {
      buf.addInt32(-1)
    } else {
      var strBuf = Buffer.from(col, 'utf8')
      buf.addInt32(strBuf.length)
      buf.add(strBuf)
    }
  })
  return buf.join(true, 'D')
}

buffers.error = function (fields) {
  return errorOrNotice(fields).join(true, 'E')
}

buffers.notice = function (fields) {
  return errorOrNotice(fields).join(true, 'N')
}

var errorOrNotice = function (fields) {
  fields = fields || []
  var buf = new BufferList()
  fields.forEach(function (field) {
    buf.addChar(field.type)
    buf.addCString(field.value)
  })
  return buf.add(Buffer.from([0])) // terminator
}

buffers.parseComplete = function () {
  return new BufferList().join(true, '1')
}

buffers.bindComplete = function () {
  return new BufferList().join(true, '2')
}

buffers.notification = function (id, channel, payload) {
  return new BufferList().addInt32(id).addCString(channel).addCString(payload).join(true, 'A')
}

buffers.emptyQuery = function () {
  return new BufferList().join(true, 'I')
}

buffers.portalSuspended = function () {
  return new BufferList().join(true, 's')
}

module.exports = buffers
