/*
 *  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 "video/timing/simulator/log_classifiers.h"

#include <optional>

#include "logging/rtc_event_log/events/logged_rtp_rtcp.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "rtc_base/checks.h"

namespace webrtc::video_timing_simulator {

std::optional<RtxOsnLoggingStatus> GetRtxOsnLoggingStatus(
    const ParsedRtcEventLog& parsed_log) {
  // Logs without video RTX packets are undeterminable.
  bool log_contained_video_rtx_packets = false;

  // Boolean accumulators for the presence of `rtx_original_sequence_number`
  // for the video RTX packets across the log.
  bool all_presence = true;
  bool any_presence = false;

  // Loop over all video RTX streams, and then over packets within the streams.
  for (const ParsedRtcEventLog::LoggedRtpStreamIncoming& stream :
       parsed_log.incoming_rtp_packets_by_ssrc()) {
    // Check for video.
    if (!parsed_log.incoming_video_ssrcs().contains(stream.ssrc)) {
      continue;
    }
    // Check for RTX.
    if (!parsed_log.incoming_rtx_ssrcs().contains(stream.ssrc)) {
      continue;
    }
    // Skip "unset rtx_ssrc" streams.
    if (stream.ssrc == 0) {
      continue;
    }
    // Check all packets for this video RTX stream.
    for (const LoggedRtpPacketIncoming& incoming_packet :
         stream.incoming_packets) {
      log_contained_video_rtx_packets = true;
      bool presence =
          incoming_packet.rtp.rtx_original_sequence_number.has_value();
      all_presence = all_presence && presence;
      any_presence = any_presence || presence;
    }
  }

  if (!log_contained_video_rtx_packets) {
    return std::nullopt;
  }
  if (all_presence) {
    RTC_DCHECK(any_presence);
    return RtxOsnLoggingStatus::kAllRtxOsnLogged;
  }
  if (any_presence) {
    return RtxOsnLoggingStatus::kSomeRtxOsnLogged;
  }
  return RtxOsnLoggingStatus::kNoRtxOsnLogged;
}

}  // namespace webrtc::video_timing_simulator
