export interface AggregatedStats {
  publisher_aggregate_stats?: PublisherAggregateStats;
  turn?: TURNAggregatedStats;
}

export interface CallEvent {
  category?: string;
  component?: string;
  description: string;
  end_timestamp: number;
  internal: boolean;
  issue_tags?: Array<string>;
  kind: string;
  severity: number;
  timestamp: number;
  type: string;
}

export interface CallTimeline {
  events: Array<CallEvent>;
}

export interface Coordinates {
  latitude: number;
  longitude: number;
}

export interface Count {
  approximate: boolean;
  value: number;
}

export interface FPSStats {
  average_fps: number;
  tracked: number;
}

export interface GeolocationResult {
  accuracy_radius: number;
  city: string;
  continent: string;
  continent_code: string;
  country: string;
  country_iso_code: string;
  latitude: number;
  longitude: number;
  subdivision: string;
  subdivision_iso_code: string;
}

export interface GetCallStatsResponse {
  aggregated?: AggregatedStats;
  average_connection_time?: number;
  call_duration_seconds: number;
  call_status: string;
  call_timeline?: CallTimeline;
  duration: string;
  is_truncated_report: boolean;
  jitter?: TimeStats;
  latency?: TimeStats;
  max_freezes_duration_seconds: number;
  max_participants: number;
  max_total_quality_limitation_duration_seconds: number;
  participant_report: Array<UserStats>;
  publishing_participants: number;
  quality_score: number;
  sfu_count: number;
  sfus: Array<SFULocationResponse>;
}

export interface MediaPubSubHint {
  audio_published: boolean;
  audio_subscribed: boolean;
  video_published: boolean;
  video_subscribed: boolean;
}

export interface PublishedTrackInfo {
  codec_mime_type?: string;
  duration_seconds?: number;
  track_type?: string;
}

export interface PublisherAggregateStats {
  by_track_type?: { [key: string]: Count };
  total?: Count;
}

export interface SFULocationResponse {
  coordinates: Coordinates;
  datacenter: string;
  id: string;
  location: Location;
}

export interface Subsession {
  ended_at: number;
  joined_at: number;
  pub_sub_hint?: MediaPubSubHint;
  sfu_id: string;
}

export interface TimeStats {
  average_seconds: number;
  max_seconds: number;
}

export interface TURNAggregatedStats {
  tcp?: Count;
  total?: Count;
}

export interface UserInfoResponse {
  custom: { [key: string]: any };
  id: string;
  image: string;
  name: string;
  roles: Array<string>;
}

export interface UserSessionStats {
  average_connection_time?: number;
  browser?: string;
  browser_version?: string;
  current_ip?: string;
  current_sfu?: string;
  device_model?: string;
  device_version?: string;
  distance_to_sfu_kilometers?: number;
  fps?: FPSStats;
  freeze_duration_seconds: number;
  geolocation?: GeolocationResult;
  group: string;
  jitter?: TimeStats;
  latency?: TimeStats;
  max_fir_per_second?: number;
  max_freeze_fraction: number;
  max_freezes_duration_seconds: number;
  max_freezes_per_second?: number;
  max_nack_per_second?: number;
  max_pli_per_second?: number;
  max_publishing_video_quality?: VideoQuality;
  max_receiving_video_quality?: VideoQuality;
  min_event_ts: number;
  os?: string;
  os_version?: string;
  packet_loss_fraction: number;
  pub_sub_hints?: MediaPubSubHint;
  published_tracks?: Array<PublishedTrackInfo>;
  publisher_jitter?: TimeStats;
  publisher_latency?: TimeStats;
  publisher_noise_cancellation_seconds?: number;
  publisher_packet_loss_fraction: number;
  publisher_quality_limitation_fraction?: number;
  publisher_video_quality_limitation_duration_seconds?: {
    [key: string]: number;
  };
  publishing_audio_codec?: string;
  publishing_duration_seconds: number;
  publishing_video_codec?: string;
  quality_score: number;
  receiving_audio_codec?: string;
  receiving_duration_seconds: number;
  receiving_video_codec?: string;
  sdk?: string;
  sdk_version?: string;
  session_id: string;
  subscriber_jitter?: TimeStats;
  subscriber_latency?: TimeStats;
  subscriber_video_quality_throttled_duration_seconds?: number;
  subsessions?: Array<Subsession>;
  timeline?: CallTimeline;
  total_pixels_in: number;
  total_pixels_out: number;
  truncated?: boolean;
  webrtc_version?: string;
}

export interface UserStats {
  feedback?: string;
  info: UserInfoResponse;
  min_event_ts: number;
  rating?: number;
  session_stats: Array<UserSessionStats>;
}

export interface VideoQuality {
  resolution?: { width: number; height: number };
  usage_type?: string;
}
