#pragma once
#include <string>

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream): stream(stream) {
      arr = "";
      i = 0;
    }
    int32_t Read(char* output_buffer, int32_t buffer_len) {
      this-> len = stream->PackageLen();
      std::unique_ptr<char[]> buf(new char[len]);
    int32_t n = 0;

    for (; i < len && n < buffer_len && i != 0; i++) {
      output_buffer[n++] = arr[i];
    }

    for (; len > 0 && n < buffer_len;) {
      len = stream->ReadPackage(buf.get());
      arr = "";
    for (int32_t cp = 0; cp < len; cp++) {
      arr += buf[cp];
    }
    for (i = 0; i < len && n < buffer_len; i++) {
      output_buffer[n++] = buf[i];
    }
    }
    return n;
    }

 private:
  int32_t len;
  int32_t i;
  PackageStream* stream;
  std::string arr;
};