#pragma once

#include <panda/protocol/http/compression/Compressor.h>
#include "brotli/decode.h"
#include "brotli/encode.h"

namespace panda { namespace protocol { namespace http { namespace compression {

struct Brotli: Compressor {
    Brotli():decoder{nullptr}, encoder{nullptr}{}
    ~Brotli() override;

    void prepare_uncompress(size_t& max_body_size) noexcept override;
    void prepare_compress(Compression::Level level) noexcept override;

    std::error_code uncompress(const string& piece, Body& body) noexcept override;
    string compress(const string& piece) noexcept override;
    string flush() noexcept override;

    virtual void reset() noexcept override;

    static bool register_factory();
private:
    ::BrotliDecoderState* decoder;
    ::BrotliEncoderState* encoder;
    size_t total_out;
};

}}}}