/*
 *  Copyright (c) 2026 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include "pc/dtls_packet_processor.h"

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

#include "api/units/timestamp.h"
#include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/logging.h"

namespace webrtc {
namespace {

// Data-only header: 1 byte type + 2 byte transport sequence number.
constexpr size_t kDataHeaderSize = 3;

}  // namespace

CopyOnWriteBuffer DtlsPacketProcessor::ProcessOutgoingPacket(
    std::span<const uint8_t> payload,
    Timestamp /*send_time*/) {
  const uint16_t seq = next_transport_seq_++;

  // Data-only packet (type 0x01).
  const uint8_t header[kDataHeaderSize] = {
      kPacketTypeData,
      static_cast<uint8_t>(seq >> 8),
      static_cast<uint8_t>(seq & 0xFF),
  };
  CopyOnWriteBuffer out(/*size=*/0,
                        /*capacity=*/kDataHeaderSize + payload.size());
  out.AppendData(header);
  out.AppendData(payload.data(), payload.size());
  return out;
}

std::optional<CopyOnWriteBuffer> DtlsPacketProcessor::ProcessIncomingPacket(
    CopyOnWriteBuffer packet,
    Timestamp /*receive_time*/) {
  if (packet.empty()) {
    return std::nullopt;
  }
  switch (packet.cdata()[0]) {
    case kPacketTypeData: {
      if (packet.size() < kDataHeaderSize) {
        RTC_LOG(LS_WARNING) << "Dropping truncated DTLS data packet";
        return std::nullopt;
      }
      // Zero-copy view of the app payload (extends to the end of the record).
      return packet.Slice(kDataHeaderSize, packet.size() - kDataHeaderSize);
    }
    default:
      RTC_LOG(LS_WARNING) << "Dropping DTLS packet with reserved type "
                          << static_cast<int>(packet.cdata()[0]);
      return std::nullopt;
  }
}

}  // namespace webrtc
