// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_
#define ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_

#include <zircon/types.h>

#include <memory>

#include <blobfs/format.h>
#include <zstd/zstd.h>

#include "compressor.h"
#include "decompressor.h"

namespace blobfs {

class ZSTDCompressor : public Compressor {
 public:
  static uint32_t InodeHeaderCompressionFlags() { return kBlobFlagZSTDCompressed; }

  // Returns the maximum possible size a buffer would need to be
  // in order to compress data of size |input_length|.
  static size_t BufferMax(size_t input_length);

  static zx_status_t Create(size_t input_size, void* compression_buffer,
                            size_t compression_buffer_length, std::unique_ptr<ZSTDCompressor>* out);
  ~ZSTDCompressor();

  ////////////////////////////////////////
  // Compressor interface
  size_t Size() const final;
  zx_status_t Update(const void* input_data, size_t input_length) final;
  zx_status_t End() final;

 private:
  ZSTDCompressor(ZSTD_CCtx* ctx, void* compression_buffer, size_t compression_buffer_length);

  ZSTD_CCtx* stream_ = nullptr;
  ZSTD_outBuffer output_ = {};
};

class AbstractZSTDDecompressor : public Decompressor {
 public:
  AbstractZSTDDecompressor() = default;
  virtual ~AbstractZSTDDecompressor() {}
  DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(AbstractZSTDDecompressor);

  // Decompressor implementation.
  virtual zx_status_t Decompress(void* uncompressed_buf, size_t* uncompressed_size,
                                 const void* compressed_buf, const size_t max_compressed_size);

 private:
  virtual size_t DecompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output,
                                  ZSTD_inBuffer* input) const = 0;
};

class ZSTDDecompressor : public AbstractZSTDDecompressor {
 public:
  ZSTDDecompressor() = default;
  DISALLOW_COPY_ASSIGN_AND_MOVE(ZSTDDecompressor);

  // AbstractZSTDDecompressor interface.
  size_t DecompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output,
                          ZSTD_inBuffer* input) const final;
};

}  // namespace blobfs

#endif  // ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_
