// 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 SRC_STORAGE_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_
#define SRC_STORAGE_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_

#include <zircon/types.h>

#include <memory>

#include <zstd/zstd.h>

#include "src/storage/blobfs/compression-settings.h"
#include "src/storage/blobfs/compression/compressor.h"
#include "src/storage/blobfs/compression/decompressor.h"
#include "src/storage/blobfs/format.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(CompressionSettings settings, 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  // SRC_STORAGE_BLOBFS_COMPRESSION_ZSTD_PLAIN_H_
