const emptyBuffer = Buffer.allocUnsafe(0);

export class BufferReader {
  private buffer: Buffer = emptyBuffer;
  // TODO(bmc): support non-utf8 encoding
  private encoding: string = 'utf-8';
  constructor(private offset: number = 0) {
  }
  public setBuffer(offset: number, buffer: Buffer): void {
    this.offset = offset;
    this.buffer = buffer;
  }
  public int16() {
    const result = this.buffer.readInt16BE(this.offset);
    this.offset += 2;
    return result;
  }
  public byte() {
    const result = this.buffer[this.offset];
    this.offset++;
    return result;
  }
  public int32() {
    const result = this.buffer.readInt32BE(this.offset);
    this.offset += 4;
    return result;
  }
  public string(length: number): string {
    const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);
    this.offset += length;
    return result;
  }
  public cstring(): string {
    var start = this.offset;
    var end = this.buffer.indexOf(0, start);
    this.offset = end + 1;
    return this.buffer.toString(this.encoding, start, end);
  }
  public bytes(length: number): Buffer {
    const result = this.buffer.slice(this.offset, this.offset + length);
    this.offset += length;
    return result;
  }
}
