// http://dev.mysql.com/doc/internals/en/query-event.html

var keys = {
  FLAGS2: 0,
  SQL_MODE: 1,
  CATALOG: 2,
  AUTO_INCREMENT: 3,
  CHARSET: 4,
  TIME_ZONE: 5,
  CATALOG_NZ: 6,
  LC_TIME_NAMES: 7,
  CHARSET_DATABASE: 8,
  TABLE_MAP_FOR_UPDATE: 9,
  MASTER_DATA_WRITTEN: 10,
  INVOKERS: 11,
  UPDATED_DB_NAMES: 12,
  MICROSECONDS: 3
};

module.exports = function parseStatusVars(buffer) {
  var result = {};
  var offset = 0;
  var key, length, username, hostname, prevOffset;
  while(offset < buffer.length) {
    key = buffer[offset++];
    val = [key];
    switch(key) {
    case keys.FLAGS2:
      result.flags = buffer.readUInt32LE(offset);
      offset += 4; break;
    case keys.SQL_MODE:
      // value is 8 bytes, but all dcumented flags are in first 4 bytes
      result.sqlMode = buffer.readUInt32LE(offset);
      offset += 8; 
      break;
    case keys.CATALOG:
      length = buffer[offset++];
      result.catalog = buffer.toString('utf8', offset, offset + length);
      offset += length + 1; // null byte after string
      break;
    case keys.CHARSET:
      result.clientCharset = buffer.readUInt16LE(offset);
      result.connectionCollation = buffer.readUInt16LE(offset + 2);
      result.serverCharset = buffer.readUInt16LE(offset + 4);
      offset += 6;
      break;
    case keys.TIME_ZONE:
      length = buffer[offset++];
      result.timeZone = buffer.toString('utf8', offset, offset + length);
      offset += length; // no null byte
      break;
    case keys.CATALOG_NZ:
      length = buffer[offset++];
      result.catalogNz = buffer.toString('utf8', offset, offset + length);
      offset += length ; // no null byte
      break;
    case keys.LC_TIME_NAMES:
      result.lcTimeNames = buffer.readUInt16LE(offset); 
      offset += 2; 
      break;
    case keys.CHARSET_DATABASE:
      result.schemaCharset = buffer.readUInt16LE(offset);
      offset += 2;
      break;
    case keys.TABLE_MAP_FOR_UPDATE:
      result.mapForUpdate1 = buffer.readUInt32LE(offset);
      result.mapForUpdate2 = buffer.readUInt32LE(offset + 4);
      offset += 8; 
      break;
    case keys.MASTER_DATA_WRITTEN:
      result.masterDataWritten = buffer.readUInt32LE(offset);
      offset += 4;
      break;
    case keys.INVOKERS:
      length = buffer[offset++];
      result.invokerUsername = buffer.toString('utf8', offset, offset + length);
      offset += length;
      length = buffer[offset++];
      result.invokerHostname = buffer.toString('utf8', offset, offset + length);
      offset += length;
      break;
    case keys.UPDATED_DB_NAMES:
      length = buffer[offset++];
      // length - number of null-terminated strings
      result.updatedDBs = []; // we'll store them as array here
      for (; length; --length) {
        prevOffset = offset;
        // fast forward to null terminating byte
        while(buffer[offset++] && offset < buffer.length) {}
        result.updatedDBs.push(buffer.toString('utf8', prevOffset, offset-1));
      }
      break;
    case keys.MICROSECONDS:
      result.microseconds = buffer.readInt16LE(offset) + (buffsre[offset+2] << 16);
      offset += 3;
    }
  }
  return result;
}