#pragma once
#include <iostream>
#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <memory>

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream);
    int32_t Read(char* output_buffer, int32_t buffer_len);
    PackageStream* ps;
};

BufferedReader::BufferedReader(PackageStream* stream) {
    char buf[1500];
    int len = 0, add = -1;
    while (add != 0) {
        add = stream->ReadPackage(buf + len);
        len += add;
    }
    std::string str = "";
    for (int i = 0; i < len; i++) {
        str += buf[i];
    }
    ps = new PackageStream(buf, 1);
}

int32_t BufferedReader::Read(char* output_buffer, int32_t buffer_len) {
    int len = 0, add = -1;
    for (int i = 0; i < buffer_len && add != 0; i++) {
        add = ps->ReadPackage(output_buffer + len);
        len += add;
    }
    return len;
}