// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @fileoverview Represents a read stream of VOM messages backed by a byte
 * array.
 * @private
 */

module.exports = ByteStreamMessageReader;

var StreamReader = require('./stream-reader.js');
var RawVomReader = require('./raw-vom-reader.js');
var TypeUtil = require('../vdl/type-util.js');

/**
 * Create a VOM message reader backed by a byte stream.
 * @constructor
 * @memberof module:vanadium.vom
 */
function ByteStreamMessageReader() {
  this.rawReader = new RawVomReader(new StreamReader());
  // Consume the header byte.
  this.headerPromise = this.rawReader.readByte(1).then(function(byte) {
    if (byte !== 0x80) {
      throw new Error('Improperly formatted bytes. Must start with 0x80');
    }
  });
}

/**
 * Get the the type of the next value message.
 * @private
 * @param {TypeDecoder} typeDecoder The current type decoder.
 * @return {Promise<Type>} The type of the next message or null if the stream
 * has ended.
 */
ByteStreamMessageReader.prototype.nextMessageType = function(typeDecoder) {
  var bsmr = this;
  return this.headerPromise.then(function() {
    return bsmr.rawReader.readInt();
  }).then(function(typeId) {
    if (typeId < 0) {
      // Type message.  We add the type to the typeDecoder and continue reading
      // trying to find a value message.
      return  bsmr.rawReader.readUint().then(function(len) {
        return bsmr.rawReader._readRawBytes(len);
      }).then(function(body) {
        return typeDecoder.defineType(-typeId, body);
      }).then(function() {
        return bsmr.nextMessageType(typeDecoder);
      });
    }
    var type = typeDecoder.lookupType(typeId);
    if (TypeUtil.shouldSendLength(type)) {
      return bsmr.rawReader.readUint().then(function() {
        return type;
      });
    }
    return type;
  }, function(err) {
    // Hopefull this is an eof.
    return null;
  });
};

ByteStreamMessageReader.prototype.addBytes = function(bytes) {
  this.rawReader._reader.addBytes(bytes);
};
