// Copyright 2020 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.

#include <fbl/algorithm.h>
#include <src/lib/chunked-compression/chunked-archive.h>
#include <src/lib/chunked-compression/compression-params.h>
#include <zstd/zstd.h>

namespace chunked_compression {

namespace {
constexpr size_t kKiB = 1024;
}  // namespace

bool CompressionParams::IsValid() const {
  return MinCompressionLevel() <= compression_level && compression_level <= MaxCompressionLevel() &&
         MinChunkSize() <= chunk_size && chunk_size % MinChunkSize() == 0;
}

size_t CompressionParams::ComputeOutputSizeLimit(size_t len) const {
  if (len == 0) {
    return 0ul;
  }
  const size_t num_frames = HeaderWriter::NumFramesForDataSize(len, chunk_size);
  size_t size = HeaderWriter::MetadataSizeForNumFrames(num_frames);
  size += (ZSTD_compressBound(chunk_size) * num_frames);
  return size;
}

int CompressionParams::DefaultCompressionLevel() { return 3; }
int CompressionParams::MinCompressionLevel() { return ZSTD_minCLevel(); }
int CompressionParams::MaxCompressionLevel() { return ZSTD_maxCLevel(); }

size_t CompressionParams::ChunkSizeForInputSize(size_t len, size_t target_size) {
  size_t rounded_target = fbl::round_up(target_size, MinChunkSize());
  if (HeaderWriter::NumFramesForDataSize(len, rounded_target) <= kChunkArchiveMaxFrames) {
    return rounded_target;
  }
  // For larger files, just max out the number of frames.
  size_t lower_bound_frame_size =
      fbl::round_up(len, kChunkArchiveMaxFrames) / kChunkArchiveMaxFrames;
  return fbl::round_up(lower_bound_frame_size, MinChunkSize());
}

size_t CompressionParams::MinChunkSize() { return 8 * kKiB; }

}  // namespace chunked_compression
