'use strict';

const Command = require('./command');
const Errors = require('../misc/errors');

/**
 * send a COM_PING: permits sending a packet containing one byte to check that the connection is active.
 * see https://mariadb.com/kb/en/library/com_ping/
 */
class Ping extends Command {
  constructor(resolve, reject) {
    super(resolve, reject);
  }

  start(out, opts, info) {
    out.startPacket(this);
    out.writeInt8(0x0e);
    out.flushBuffer(true);
    this.emit('send_end');
    this.onPacketReceive = this.readPingResponsePacket;
  }

  /**
   * Read ping response packet.
   * packet can be :
   * - an ERR_Packet
   * - a OK_Packet
   *
   * @param packet  query response
   * @param out     output writer
   * @param opts    connection options
   * @param info    connection info
   */
  readPingResponsePacket(packet, out, opts, info) {
    if (packet.peek() !== 0x00) {
      return this.throwNewError(
        'unexpected packet',
        false,
        info,
        '42000',
        Errors.ER_PING_BAD_PACKET
      );
    }
    packet.skip(1); //skip header
    packet.skipLengthCodedNumber(); //affected rows
    packet.skipLengthCodedNumber(); //insert ids
    info.status = packet.readUInt16();
    this.successEnd(null);
  }
}

module.exports = Ping;