// Copyright 2020 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#include "pw_ring_buffer/prefixed_entry_ring_buffer.h"

#include <cstring>

#include "pw_varint/varint.h"

namespace pw {
namespace ring_buffer {

using std::byte;

void PrefixedEntryRingBuffer::Clear() {
  read_idx_ = 0;
  write_idx_ = 0;
  entry_count_ = 0;
}

Status PrefixedEntryRingBuffer::SetBuffer(span<byte> buffer) {
  if ((buffer.data() == nullptr) ||  //
      (buffer.size_bytes() == 0) ||  //
      (buffer.size_bytes() > kMaxBufferBytes)) {
    return Status::INVALID_ARGUMENT;
  }

  buffer_ = buffer.data();
  buffer_bytes_ = buffer.size_bytes();

  Clear();
  return Status::OK;
}

Status PrefixedEntryRingBuffer::PushBack(span<const byte> data,
                                         byte user_preamble_data) {
  if (buffer_ == nullptr) {
    return Status::FAILED_PRECONDITION;
  }
  if (data.size_bytes() == 0) {
    return Status::INVALID_ARGUMENT;
  }

  // Prepare the preamble, and ensure we can fit the preamble and entry.
  byte varint_buf[kMaxEntryPreambleBytes];
  size_t varint_bytes = varint::Encode<size_t>(data.size_bytes(), varint_buf);
  size_t total_write_bytes =
      (user_preamble_ ? 1 : 0) + varint_bytes + data.size_bytes();
  if (buffer_bytes_ < total_write_bytes) {
    return Status::OUT_OF_RANGE;
  }

  // Drop old entries until we have space for the new entry.
  while (RawAvailableBytes() < total_write_bytes) {
    PopFront();
  }

  // Write the new entry into the ring buffer.
  if (user_preamble_) {
    RawWrite(span(&user_preamble_data, sizeof(user_preamble_data)));
  }
  RawWrite(span(varint_buf, varint_bytes));
  RawWrite(data);
  entry_count_++;
  return Status::OK;
}

auto GetOutput(span<byte> data_out, size_t* write_index) {
  return [data_out, write_index](span<const byte> src) -> Status {
    size_t copy_size = std::min(data_out.size_bytes(), src.size_bytes());

    memcpy(data_out.data() + *write_index, src.data(), copy_size);
    *write_index += copy_size;

    return (copy_size == src.size_bytes()) ? Status::OK
                                           : Status::RESOURCE_EXHAUSTED;
  };
}

Status PrefixedEntryRingBuffer::PeekFront(span<byte> data, size_t* bytes_read) {
  *bytes_read = 0;
  return InternalRead(GetOutput(data, bytes_read), false);
}

Status PrefixedEntryRingBuffer::PeekFront(ReadOutput output) {
  return InternalRead(output, false);
}

Status PrefixedEntryRingBuffer::PeekFrontWithPreamble(span<byte> data,
                                                      size_t* bytes_read) {
  *bytes_read = 0;
  return InternalRead(GetOutput(data, bytes_read), true);
}

Status PrefixedEntryRingBuffer::PeekFrontWithPreamble(ReadOutput output) {
  return InternalRead(output, true);
}

// T should be similar to Status (*read_output)(span<const byte>)
template <typename T>
Status PrefixedEntryRingBuffer::InternalRead(T read_output, bool get_preamble) {
  if (buffer_ == nullptr) {
    return Status::FAILED_PRECONDITION;
  }
  if (EntryCount() == 0) {
    return Status::OUT_OF_RANGE;
  }

  // Figure out where to start reading (wrapped); accounting for preamble.
  EntryInfo info = FrontEntryInfo();
  size_t read_bytes = info.data_bytes;
  size_t data_read_idx = read_idx_;
  if (get_preamble) {
    read_bytes += info.preamble_bytes;
  } else {
    data_read_idx = IncrementIndex(data_read_idx, info.preamble_bytes);
  }

  // Read bytes, stopping at the end of the buffer if this entry wraps.
  size_t bytes_until_wrap = buffer_bytes_ - data_read_idx;
  size_t bytes_to_copy = std::min(read_bytes, bytes_until_wrap);
  Status status = read_output(span(buffer_ + data_read_idx, bytes_to_copy));

  // If the entry wrapped, read the remaining bytes.
  if (status.ok() && (bytes_to_copy < read_bytes)) {
    status = read_output(span(buffer_, read_bytes - bytes_to_copy));
  }
  return status;
}

Status PrefixedEntryRingBuffer::PopFront() {
  if (buffer_ == nullptr) {
    return Status::FAILED_PRECONDITION;
  }
  if (EntryCount() == 0) {
    return Status::OUT_OF_RANGE;
  }

  // Advance the read pointer past the front entry to the next one.
  EntryInfo info = FrontEntryInfo();
  size_t entry_bytes = info.preamble_bytes + info.data_bytes;
  read_idx_ = IncrementIndex(read_idx_, entry_bytes);
  entry_count_--;
  return Status::OK;
}

Status PrefixedEntryRingBuffer::Dering() {
  if (buffer_ == nullptr) {
    return Status::FAILED_PRECONDITION;
  }
  // Check if by luck we're already deringed.
  if (read_idx_ == 0) {
    return Status::OK;
  }

  auto buffer_span = span(buffer_, buffer_bytes_);
  std::rotate(
      buffer_span.begin(), buffer_span.begin() + read_idx_, buffer_span.end());

  // If the new index is past the end of the buffer,
  // alias it back (wrap) to the start of the buffer.
  if (write_idx_ < read_idx_) {
    write_idx_ += buffer_bytes_;
  }
  write_idx_ -= read_idx_;
  read_idx_ = 0;
  return Status::OK;
}

size_t PrefixedEntryRingBuffer::FrontEntryDataSizeBytes() {
  if (EntryCount() == 0) {
    return 0;
  }
  return FrontEntryInfo().data_bytes;
}

size_t PrefixedEntryRingBuffer::FrontEntryTotalSizeBytes() {
  if (EntryCount() == 0) {
    return 0;
  }
  EntryInfo info = FrontEntryInfo();
  return info.preamble_bytes + info.data_bytes;
}

PrefixedEntryRingBuffer::EntryInfo PrefixedEntryRingBuffer::FrontEntryInfo() {
  // Entry headers consists of: (optional prefix byte, varint size, data...)

  // Read the entry header; extract the varint and it's size in bytes.
  byte varint_buf[kMaxEntryPreambleBytes];
  RawRead(varint_buf,
          IncrementIndex(read_idx_, user_preamble_ ? 1 : 0),
          kMaxEntryPreambleBytes);
  uint64_t entry_size;
  size_t varint_size = varint::Decode(varint_buf, &entry_size);

  EntryInfo info = {};
  info.preamble_bytes = (user_preamble_ ? 1 : 0) + varint_size;
  info.data_bytes = entry_size;
  return info;
}

// Comparisons ordered for more probable early exits, assuming the reader is
// not far behind the writer compared to the size of the ring.
size_t PrefixedEntryRingBuffer::RawAvailableBytes() {
  // Case: Not wrapped.
  if (read_idx_ < write_idx_) {
    return buffer_bytes_ - (write_idx_ - read_idx_);
  }
  // Case: Wrapped
  if (read_idx_ > write_idx_) {
    return read_idx_ - write_idx_;
  }
  // Case: Matched read and write heads; empty or full.
  return entry_count_ ? 0 : buffer_bytes_;
}

void PrefixedEntryRingBuffer::RawWrite(span<const std::byte> source) {
  // Write until the end of the source or the backing buffer.
  size_t bytes_until_wrap = buffer_bytes_ - write_idx_;
  size_t bytes_to_copy = std::min(source.size(), bytes_until_wrap);
  memcpy(buffer_ + write_idx_, source.data(), bytes_to_copy);

  // If there wasn't space in the backing buffer, wrap to the front.
  if (bytes_to_copy < source.size()) {
    memcpy(
        buffer_, source.data() + bytes_to_copy, source.size() - bytes_to_copy);
  }
  write_idx_ = IncrementIndex(write_idx_, source.size());
}

void PrefixedEntryRingBuffer::RawRead(byte* destination,
                                      size_t source_idx,
                                      size_t length_bytes) {
  // Read the pre-wrap bytes.
  size_t bytes_until_wrap = buffer_bytes_ - source_idx;
  size_t bytes_to_copy = std::min(length_bytes, bytes_until_wrap);
  memcpy(destination, buffer_ + source_idx, bytes_to_copy);

  // Read the post-wrap bytes, if needed.
  if (bytes_to_copy < length_bytes) {
    memcpy(destination + bytes_to_copy, buffer_, length_bytes - bytes_to_copy);
  }
}

size_t PrefixedEntryRingBuffer::IncrementIndex(size_t index, size_t count) {
  // Note: This doesn't use modulus (%) since the branch is cheaper, and we
  // guarantee that count will never be greater than buffer_bytes_.
  index += count;
  if (index > buffer_bytes_) {
    index -= buffer_bytes_;
  }
  return index;
}

}  // namespace ring_buffer
}  // namespace pw
