// 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.
#pragma once

#include <cstddef>
#include <cstdint>
#include <span>

#include "pw_rpc_protos/packet.pwpb.h"
#include "pw_status/status_with_size.h"

namespace pw::rpc::internal {

class Packet {
 public:
  static constexpr uint32_t kUnassignedId = 0;

  // Parses a packet from a protobuf message. Missing or malformed fields take
  // their default values.
  static Packet FromBuffer(std::span<const std::byte> data);

  constexpr Packet(PacketType type,
                   uint32_t channel_id = kUnassignedId,
                   uint32_t service_id = kUnassignedId,
                   uint32_t method_id = kUnassignedId,
                   std::span<const std::byte> payload = {},
                   Status status = Status::OK)
      : type_(type),
        channel_id_(channel_id),
        service_id_(service_id),
        method_id_(method_id),
        payload_(payload),
        status_(status) {}

  // Encodes the packet into its wire format. Returns the encoded size.
  StatusWithSize Encode(std::span<std::byte> buffer) const;

  // Determines the space required to encode the packet proto fields for a
  // response. This may be used to split the buffer into reserved space and
  // available space for the payload.
  size_t MinEncodedSizeBytes() const;

  bool is_control() const { return !is_rpc(); }
  bool is_rpc() const { return type_ == PacketType::RPC; }

  PacketType type() const { return type_; }
  uint32_t channel_id() const { return channel_id_; }
  uint32_t service_id() const { return service_id_; }
  uint32_t method_id() const { return method_id_; }
  const std::span<const std::byte>& payload() const { return payload_; }
  Status status() const { return status_; }

  void set_type(PacketType type) { type_ = type; }
  void set_channel_id(uint32_t channel_id) { channel_id_ = channel_id; }
  void set_service_id(uint32_t service_id) { service_id_ = service_id; }
  void set_method_id(uint32_t method_id) { method_id_ = method_id; }
  void set_payload(std::span<const std::byte> payload) { payload_ = payload; }
  void set_status(Status status) { status_ = status; }

 private:
  PacketType type_;
  uint32_t channel_id_;
  uint32_t service_id_;
  uint32_t method_id_;
  std::span<const std::byte> payload_;
  Status status_;
};

}  // namespace pw::rpc::internal
