/*
 *  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 <vector>

#include "api/stats/rtc_stats.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(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(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(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(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() 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;

 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(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() 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() override;

  std::optional<double> jitter;
  std::optional<int32_t> packets_lost;  // Signed per RFC 3550

 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() 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(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;
  // 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(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<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;
  std::optional<uint64_t> qp_sum;
  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/#remoteinboundrtpstats-dict*
class RTC_EXPORT RTCRemoteInboundRtpStreamStats final
    : public RTCReceivedRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL();
  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;
};

// https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
class RTC_EXPORT RTCRemoteOutboundRtpStreamStats final
    : public RTCSentRtpStreamStats {
 public:
  WEBRTC_RTCSTATS_DECL();
  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() 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(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(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(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/#playoutstats-dict*
class RTC_EXPORT RTCAudioPlayoutStats final : public RTCStats {
 public:
  WEBRTC_RTCSTATS_DECL();
  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_
