// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

syntax = "proto3";

option java_multiple_files = true;

package signalservice;

message SubmitCallQualitySurveyRequest {
  // Indicates whether the caller was generally satisfied with the quality of
  // the call
  bool user_satisfied = 1;

  // A list of call quality issues selected by the caller
  repeated string call_quality_issues = 2;

  // A free-form description of any additional issues as written by the caller
  optional string additional_issues_description = 3;

  // A URL for a set of debug logs associated with the call if the caller chose
  // to submit debug logs
  optional string debug_log_url = 4;

  // The time at which the call started in milliseconds since the epoch
  int64 start_timestamp = 5;

  // The time at which the call ended in milliseconds since the epoch
  int64 end_timestamp = 6;

  // The type of call; note that direct voice calls can become video calls and
  // vice versa, and this field indicates which mode was selected at call
  // initiation time. At the time of writing, expected call types are
  // "direct_voice", "direct_video", "group", and "call_link".
  string call_type = 7;

  // Indicates whether the call completed without error or if it terminated
  // abnormally
  bool success = 8;

  // A client-defined, but human-readable reason for call termination
  string call_end_reason = 9;

  // The median round-trip time, measured in milliseconds, for STUN/ICE packets
  // (i.e. connection maintenance and establishment)
  optional float connection_rtt_median = 10;

  // The median round-trip time, measured in milliseconds, for RTP/RTCP packets
  // for audio streams
  optional float audio_rtt_median = 11;

  // The median round-trip time, measured in milliseconds, for RTP/RTCP packets
  // for video streams
  optional float video_rtt_median = 12;

  // The median jitter for audio streams, measured in milliseconds, for the
  // duration of the call as measured by the client submitting the survey
  optional float audio_recv_jitter_median = 13;

  // The median jitter for video streams, measured in milliseconds, for the
  // duration of the call as measured by the client submitting the survey
  optional float video_recv_jitter_median = 14;

  // The median jitter for audio streams, measured in milliseconds, for the
  // duration of the call as measured by the remote endpoint in the call (either
  // the peer of the client submitting the survey in a direct call or the SFU in
  // a group call)
  optional float audio_send_jitter_median = 15;

  // The median jitter for video streams, measured in milliseconds, for the
  // duration of the call as measured by the remote endpoint in the call (either
  // the peer of the client submitting the survey in a direct call or the SFU in
  // a group call)
  optional float video_send_jitter_median = 16;

  // The fraction of audio packets lost over the duration of the call as
  // measured by the client submitting the survey
  optional float audio_recv_packet_loss_fraction = 17;

  // The fraction of video packets lost over the duration of the call as
  // measured by the client submitting the survey
  optional float video_recv_packet_loss_fraction = 18;

  // The fraction of audio packets lost over the duration of the call as
  // measured by the remote endpoint in the call (either the peer of the client
  // submitting the survey in a direct call or the SFU in a group call)
  optional float audio_send_packet_loss_fraction = 19;

  // The fraction of video packets lost over the duration of the call as
  // measured by the remote endpoint in the call (either the peer of the client
  // submitting the survey in a direct call or the SFU in a group call)
  optional float video_send_packet_loss_fraction = 20;

  // Machine-generated telemetry from the call; this is a serialized protobuf
  // entity generated (and, critically, explained to the user!) by the calling
  // library
  optional bytes call_telemetry = 21;
}
