/*
 *  Copyright 2016 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.
 */

#ifndef API_STATS_RTCSTATS_OBJECTS_H_
#define API_STATS_RTCSTATS_OBJECTS_H_

#include <stdint.h>

#include <map>
#include <memory>
#include <optional>
#include <string>

#include "api/stats/rtc_stats.h"
#include "api/units/timestamp.h"
#include "rtc_base/system/rtc_export.h"

namespace webrtc {

// https://w3c.github.io/webrtc-stats/#certificatestats-dict*
class RTC_EXPORT RTCCertificateStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCCertificateStats);
  RTCCertificateStats(std::string id, Timestamp timestamp);
  ~RTCCertificateStats() override;

  std::optional<std::string> fingerprint;
  std::optional<std::string> fingerprint_algorithm;
  std::optional<std::string> base64_certificate;
  std::optional<std::string> issuer_certificate_id;
};

// https://w3c.github.io/webrtc-stats/#codec-dict*
class RTC_EXPORT RTCCodecStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCCodecStats);
  RTCCodecStats(std::string id, Timestamp timestamp);
  ~RTCCodecStats() override;

  std::optional<std::string> transport_id;
  std::optional<uint32_t> payload_type;
  std::optional<std::string> mime_type;
  std::optional<uint32_t> clock_rate;
  std::optional<uint32_t> channels;
  std::optional<std::string> sdp_fmtp_line;
};

// https://w3c.github.io/webrtc-stats/#dcstats-dict*
class RTC_EXPORT RTCDataChannelStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCDataChannelStats);
  RTCDataChannelStats(std::string id, Timestamp timestamp);
  ~RTCDataChannelStats() override;

  std::optional<std::string> label;
  std::optional<std::string> protocol;
  std::optional<int32_t> data_channel_identifier;
  std::optional<std::string> state;
  std::optional<uint32_t> messages_sent;
  std::optional<uint64_t> bytes_sent;
  std::optional<uint32_t> messages_received;
  std::optional<uint64_t> bytes_received;
};

// https://w3c.github.io/webrtc-stats/#candidatepair-dict*
class RTC_EXPORT RTCIceCandidatePairStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCIceCandidatePairStats);
  RTCIceCandidatePairStats(std::string id, Timestamp timestamp);
  ~RTCIceCandidatePairStats() override;

  std::optional<std::string> transport_id;
  std::optional<std::string> local_candidate_id;
  std::optional<std::string> remote_candidate_id;
  std::optional<std::string> state;
  // Obsolete: priority
  std::optional<uint64_t> priority;
  std::optional<bool> nominated;
  // `writable` does not exist in the spec and old comments suggest it used to
  // exist but was incorrectly implemented.
  // TODO(https://crbug.com/webrtc/14171): Standardize and/or modify
  // implementation.
  std::optional<bool> writable;
  std::optional<uint64_t> packets_sent;
  std::optional<uint64_t> packets_received;
  std::optional<uint64_t> bytes_sent;
  std::optional<uint64_t> bytes_received;
  std::optional<double> total_round_trip_time;
  std::optional<double> current_round_trip_time;
  std::optional<double> available_outgoing_bitrate;
  std::optional<double> available_incoming_bitrate;
  std::optional<uint64_t> requests_received;
  std::optional<uint64_t> requests_sent;
  std::optional<uint64_t> responses_received;
  std::optional<uint64_t> responses_sent;
  std::optional<uint64_t> consent_requests_sent;
  std::optional<uint64_t> packets_discarded_on_send;
  std::optional<uint64_t> bytes_discarded_on_send;
  std::optional<double> last_packet_received_timestamp;
  std::optional<double> last_packet_sent_timestamp;
};

// https://w3c.github.io/webrtc-stats/#icecandidate-dict*
class RTC_EXPORT RTCIceCandidateStats : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCIceCandidateStats);
  ~RTCIceCandidateStats() override;

  std::optional<std::string> transport_id;
  // Obsolete: is_remote
  std::optional<bool> is_remote;
  std::optional<std::string> network_type;
  std::optional<std::string> ip;
  std::optional<std::string> address;
  std::optional<int32_t> port;
  std::optional<std::string> protocol;
  std::optional<std::string> relay_protocol;
  std::optional<std::string> candidate_type;
  std::optional<int32_t> priority;
  std::optional<std::string> url;
  std::optional<std::string> foundation;
  std::optional<std::string> related_address;
  std::optional<int32_t> related_port;
  std::optional<std::string> username_fragment;
  std::optional<std::string> tcp_type;

  // The following metrics are NOT exposed to JavaScript. We should consider
  // standardizing or removing them.
  std::optional<bool> vpn;
  std::optional<std::string> network_adapter_type;
  std::optional<std::string> network_slice;

 protected:
  RTCIceCandidateStats(std::string id, Timestamp timestamp, bool is_remote);
};

// In the spec both local and remote varieties are of type RTCIceCandidateStats.
// But here we define them as subclasses of `RTCIceCandidateStats` because the
// `kType` need to be different ("RTCStatsType type") in the local/remote case.
// https://w3c.github.io/webrtc-stats/#rtcstatstype-str*
// This forces us to have to override copy() and type().
class RTC_EXPORT RTCLocalIceCandidateStats final : public RTCIceCandidateStats {
 public:
  static const char kType[];
  RTCLocalIceCandidateStats(std::string id, Timestamp timestamp);
  std::unique_ptr<RTCStats> copy() const override;
  const char* type() const override;
};

class RTC_EXPORT RTCRemoteIceCandidateStats final
    : public RTCIceCandidateStats {
 public:
  static const char kType[];
  RTCRemoteIceCandidateStats(std::string id, Timestamp timestamp);
  std::unique_ptr<RTCStats> copy() const override;
  const char* type() const override;
};

// https://w3c.github.io/webrtc-stats/#pcstats-dict*
class RTC_EXPORT RTCPeerConnectionStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCPeerConnectionStats);
  RTCPeerConnectionStats(std::string id, Timestamp timestamp);
  ~RTCPeerConnectionStats() override;

  std::optional<uint32_t> data_channels_opened;
  std::optional<uint32_t> data_channels_closed;
};

// https://w3c.github.io/webrtc-stats/#streamstats-dict*
class RTC_EXPORT RTCRtpStreamStats : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCRtpStreamStats);
  ~RTCRtpStreamStats() override;

  std::optional<uint32_t> ssrc;
  std::optional<std::string> kind;
  std::optional<std::string> transport_id;
  std::optional<std::string> codec_id;

 protected:
  RTCRtpStreamStats(std::string id, Timestamp timestamp);
};

// https://www.w3.org/TR/webrtc-stats/#receivedrtpstats-dict*
class RTC_EXPORT RTCReceivedRtpStreamStats : public RTCRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCReceivedRtpStreamStats);
  ~RTCReceivedRtpStreamStats() override;

  std::optional<double> jitter;
  std::optional<int32_t> packets_lost;  // Signed per RFC 3550
  // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsreceivedwithect1
  std::optional<int64_t> packets_received_with_ect1;
  // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsreceivedwithce
  std::optional<int64_t> packets_received_with_ce;
  // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsreportedaslost
  std::optional<int64_t> packets_reported_as_lost;
  // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsreportedaslostbutrecovered
  std::optional<int64_t> packets_reported_as_lost_but_recovered;

 protected:
  RTCReceivedRtpStreamStats(std::string id, Timestamp timestamp);
};

// https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict*
class RTC_EXPORT RTCSentRtpStreamStats : public RTCRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCSentRtpStreamStats);
  ~RTCSentRtpStreamStats() override;

  std::optional<uint64_t> packets_sent;
  std::optional<uint64_t> bytes_sent;

 protected:
  RTCSentRtpStreamStats(std::string id, Timestamp timestamp);
};

// https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict*
class RTC_EXPORT RTCInboundRtpStreamStats final
    : public RTCReceivedRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCInboundRtpStreamStats);
  RTCInboundRtpStreamStats(std::string id, Timestamp timestamp);
  ~RTCInboundRtpStreamStats() override;

  std::optional<std::string> playout_id;
  std::optional<std::string> track_identifier;
  std::optional<std::string> mid;
  std::optional<std::string> remote_id;
  std::optional<uint32_t> packets_received;
  std::optional<uint64_t> packets_discarded;
  std::optional<uint64_t> fec_packets_received;
  std::optional<uint64_t> fec_bytes_received;
  std::optional<uint64_t> fec_packets_discarded;
  // Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated.
  std::optional<uint32_t> fec_ssrc;
  std::optional<uint64_t> bytes_received;
  std::optional<uint64_t> header_bytes_received;
  // Inbound RTX stats. Only defined when RTX is used and it is therefore
  // possible to distinguish retransmissions.
  std::optional<uint64_t> retransmitted_packets_received;
  std::optional<uint64_t> retransmitted_bytes_received;
  std::optional<uint32_t> rtx_ssrc;

  std::optional<double> last_packet_received_timestamp;
  std::optional<double> jitter_buffer_delay;
  std::optional<double> jitter_buffer_target_delay;
  std::optional<double> jitter_buffer_minimum_delay;
  std::optional<uint64_t> jitter_buffer_emitted_count;
  std::optional<uint64_t> total_samples_received;
  std::optional<uint64_t> concealed_samples;
  std::optional<uint64_t> silent_concealed_samples;
  std::optional<uint64_t> concealment_events;
  std::optional<uint64_t> inserted_samples_for_deceleration;
  std::optional<uint64_t> removed_samples_for_acceleration;
  std::optional<double> audio_level;
  std::optional<double> total_audio_energy;
  std::optional<double> total_samples_duration;
  // Stats below are only implemented or defined for video.
  std::optional<uint32_t> frames_received;
  std::optional<uint32_t> frame_width;
  std::optional<uint32_t> frame_height;
  std::optional<double> frames_per_second;
  std::optional<uint32_t> frames_decoded;
  std::optional<uint32_t> key_frames_decoded;
  std::optional<uint32_t> frames_dropped;
  std::optional<double> total_decode_time;
  std::optional<double> total_processing_delay;
  std::optional<double> total_assembly_time;
  std::optional<uint32_t> frames_assembled_from_multiple_packets;
  // TODO(https://crbug.com/webrtc/15600): Implement framesRendered, which is
  // incremented at the same time that totalInterFrameDelay and
  // totalSquaredInterFrameDelay is incremented. (Dividing inter-frame delay by
  // framesDecoded is slightly wrong.)
  // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-framesrendered
  //
  // TODO(https://crbug.com/webrtc/15601): Inter-frame, pause and freeze metrics
  // all related to when the frame is rendered, but our implementation measures
  // at delivery to sink, not at actual render time. When we have an actual
  // frame rendered callback, move the calculating of these metrics to there in
  // order to make them more accurate.
  std::optional<double> total_inter_frame_delay;
  std::optional<double> total_squared_inter_frame_delay;
  std::optional<uint32_t> pause_count;
  std::optional<double> total_pauses_duration;
  std::optional<uint32_t> freeze_count;
  std::optional<double> total_freezes_duration;
  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype
  std::optional<std::string> content_type;
  // Only populated if audio/video sync is enabled.
  // TODO(https://crbug.com/webrtc/14177): Expose even if A/V sync is off?
  std::optional<double> estimated_playout_timestamp;
  // Only defined for video.
  // In JavaScript, this is only exposed if HW exposure is allowed.
  std::optional<std::string> decoder_implementation;
  // FIR and PLI counts are only defined for |kind == "video"|.
  std::optional<uint32_t> fir_count;
  std::optional<uint32_t> pli_count;
  std::optional<uint32_t> nack_count;
  std::optional<uint64_t> qp_sum;
  std::optional<double> total_corruption_probability;
  std::optional<double> total_squared_corruption_probability;
  std::optional<uint64_t> corruption_measurements;
  // This is a remnant of the legacy getStats() API. When the "video-timing"
  // header extension is used,
  // https://webrtc.github.io/webrtc-org/experiments/rtp-hdrext/video-timing/,
  // `googTimingFrameInfo` is exposed with the value of
  // TimingFrameInfo::ToString().
  // TODO(https://crbug.com/webrtc/14586): Unship or standardize this metric.
  std::optional<std::string> goog_timing_frame_info;
  // In JavaScript, this is only exposed if HW exposure is allowed.
  std::optional<bool> power_efficient_decoder;

  // The following metrics are NOT exposed to JavaScript. We should consider
  // standardizing or removing them.
  std::optional<uint64_t> jitter_buffer_flushes;
  std::optional<uint64_t> delayed_packet_outage_samples;
  std::optional<double> relative_packet_arrival_delay;
  std::optional<uint32_t> interruption_count;
  std::optional<double> total_interruption_duration;
  std::optional<double> min_playout_delay;
};

// https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict*
class RTC_EXPORT RTCOutboundRtpStreamStats final
    : public RTCSentRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCOutboundRtpStreamStats);
  RTCOutboundRtpStreamStats(std::string id, Timestamp timestamp);
  ~RTCOutboundRtpStreamStats() override;

  std::optional<std::string> media_source_id;
  std::optional<std::string> remote_id;
  std::optional<std::string> mid;
  std::optional<std::string> rid;
  std::optional<uint32_t> encoding_index;
  std::optional<uint64_t> retransmitted_packets_sent;
  std::optional<uint64_t> header_bytes_sent;
  std::optional<uint64_t> retransmitted_bytes_sent;
  std::optional<double> target_bitrate;
  std::optional<uint32_t> frames_encoded;
  std::optional<uint32_t> key_frames_encoded;
  std::optional<double> total_encode_time;
  std::optional<uint64_t> total_encoded_bytes_target;
  std::optional<uint32_t> frame_width;
  std::optional<uint32_t> frame_height;
  std::optional<double> frames_per_second;
  std::optional<uint32_t> frames_sent;
  std::optional<uint32_t> huge_frames_sent;
  std::optional<double> total_packet_send_delay;
  std::optional<std::string> quality_limitation_reason;
  std::optional<std::map<std::string, double>> quality_limitation_durations;
  // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges
  std::optional<uint32_t> quality_limitation_resolution_changes;
  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype
  std::optional<std::string> content_type;
  // In JavaScript, this is only exposed if HW exposure is allowed.
  // Only implemented for video.
  // TODO(https://crbug.com/webrtc/14178): Implement for audio as well.
  std::optional<std::string> encoder_implementation;
  // FIR and PLI counts are only defined for |kind == "video"|.
  std::optional<uint32_t> fir_count;
  std::optional<uint32_t> pli_count;
  std::optional<uint32_t> nack_count;
  // QP and PSNR are only defined for video.
  std::optional<uint64_t> qp_sum;
  std::optional<std::map<std::string, double>> psnr_sum;  // y, u, v.
  std::optional<uint32_t> psnr_measurements;
  std::optional<bool> active;
  // In JavaScript, this is only exposed if HW exposure is allowed.
  std::optional<bool> power_efficient_encoder;
  std::optional<std::string> scalability_mode;

  // RTX ssrc. Only present if RTX is negotiated.
  std::optional<uint32_t> rtx_ssrc;

  // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-packetssentwithect1
  std::optional<int64_t> packets_sent_with_ect1;
};

// https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict*
class RTC_EXPORT RTCRemoteInboundRtpStreamStats final
    : public RTCReceivedRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCRemoteInboundRtpStreamStats);
  RTCRemoteInboundRtpStreamStats(std::string id, Timestamp timestamp);
  ~RTCRemoteInboundRtpStreamStats() override;

  std::optional<std::string> local_id;
  std::optional<double> round_trip_time;
  std::optional<double> fraction_lost;
  std::optional<double> total_round_trip_time;
  std::optional<int32_t> round_trip_time_measurements;
  std::optional<int64_t> packets_with_bleached_ect1_marking;
};

// https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
class RTC_EXPORT RTCRemoteOutboundRtpStreamStats final
    : public RTCSentRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCRemoteOutboundRtpStreamStats);
  RTCRemoteOutboundRtpStreamStats(std::string id, Timestamp timestamp);
  ~RTCRemoteOutboundRtpStreamStats() override;

  std::optional<std::string> local_id;
  std::optional<double> remote_timestamp;
  std::optional<uint64_t> reports_sent;
  std::optional<double> round_trip_time;
  std::optional<uint64_t> round_trip_time_measurements;
  std::optional<double> total_round_trip_time;
};

// https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats
class RTC_EXPORT RTCMediaSourceStats : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCMediaSourceStats);
  ~RTCMediaSourceStats() override;

  std::optional<std::string> track_identifier;
  std::optional<std::string> kind;

 protected:
  RTCMediaSourceStats(std::string id, Timestamp timestamp);
};

// https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats
class RTC_EXPORT RTCAudioSourceStats final : public RTCMediaSourceStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCAudioSourceStats);
  RTCAudioSourceStats(std::string id, Timestamp timestamp);
  ~RTCAudioSourceStats() override;

  std::optional<double> audio_level;
  std::optional<double> total_audio_energy;
  std::optional<double> total_samples_duration;
  std::optional<double> echo_return_loss;
  std::optional<double> echo_return_loss_enhancement;
};

// https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats
class RTC_EXPORT RTCVideoSourceStats final : public RTCMediaSourceStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCVideoSourceStats);
  RTCVideoSourceStats(std::string id, Timestamp timestamp);
  ~RTCVideoSourceStats() override;

  std::optional<uint32_t> width;
  std::optional<uint32_t> height;
  std::optional<uint32_t> frames;
  std::optional<double> frames_per_second;
};

// https://w3c.github.io/webrtc-stats/#transportstats-dict*
class RTC_EXPORT RTCTransportStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCTransportStats);
  RTCTransportStats(std::string id, Timestamp timestamp);
  ~RTCTransportStats() override;

  std::optional<uint64_t> bytes_sent;
  std::optional<uint64_t> packets_sent;
  std::optional<uint64_t> bytes_received;
  std::optional<uint64_t> packets_received;
  std::optional<std::string> rtcp_transport_stats_id;
  std::optional<std::string> dtls_state;
  std::optional<std::string> selected_candidate_pair_id;
  std::optional<std::string> local_certificate_id;
  std::optional<std::string> remote_certificate_id;
  std::optional<std::string> tls_version;
  std::optional<std::string> dtls_cipher;
  std::optional<std::string> dtls_role;
  std::optional<std::string> srtp_cipher;
  std::optional<uint32_t> selected_candidate_pair_changes;
  std::optional<std::string> ice_role;
  std::optional<std::string> ice_local_username_fragment;
  std::optional<std::string> ice_state;
  // https://w3c.github.io/webrtc-stats/#dom-rtctransportstats-ccfbmessagesreceived
  std::optional<int> ccfb_messages_received;
};

// https://w3c.github.io/webrtc-stats/#playoutstats-dict*
class RTC_EXPORT RTCAudioPlayoutStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL(RTCAudioPlayoutStats);
  RTCAudioPlayoutStats(const std::string& id, Timestamp timestamp);
  ~RTCAudioPlayoutStats() override;

  std::optional<std::string> kind;
  std::optional<double> synthesized_samples_duration;
  std::optional<uint64_t> synthesized_samples_events;
  std::optional<double> total_samples_duration;
  std::optional<double> total_playout_delay;
  std::optional<uint64_t> total_samples_count;
};

}  // namespace webrtc

#endif  // API_STATS_RTCSTATS_OBJECTS_H_
