#pragma once
#include <string>
#include <memory>

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* bfr_s) : bfr_s(bfr_s) {
        bfr = "";
        i = 0;
    }

    int32_t Read(char* out_bfr, int32_t bfr_len) {
        this->size = bfr_s->PackageLen();
        std::unique_ptr<char[]> buf(new char[size]);
        int32_t n = 0;

        for (; i < size && n < bfr_len && i != 0; i++)
            out_bfr[n++] = bfr[i];

        for (; size > 0 && n < bfr_len;) {
            size = bfr_s->ReadPackage(buf.get());
            bfr = "";

            for (int32_t x = 0; x < size; x++)
                bfr += buf[x];

            for (i = 0; i < size && n < bfr_len; i++)
                out_bfr[n++] = buf[i];
        }

        return n;
    }

 private:
    int32_t size;
    int32_t i;
    PackageStream* bfr_s;
    std::string bfr;
};