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

// This file contains enums related to IPv4/IPv6 metrics.

#ifndef API_UMAMETRICS_H_
#define API_UMAMETRICS_H_

#include "rtc_base/refcount.h"

namespace webrtc {

// Used to specify which enum counter type we're incrementing in
// MetricsObserverInterface::IncrementEnumCounter.
enum PeerConnectionEnumCounterType {
  kEnumCounterAddressFamily,
  // For the next 2 counters, we track them separately based on the "first hop"
  // protocol used by the local candidate. "First hop" means the local candidate
  // type in the case of non-TURN candidates, and the protocol used to connect
  // to the TURN server in the case of TURN candidates.
  kEnumCounterIceCandidatePairTypeUdp,
  kEnumCounterIceCandidatePairTypeTcp,

  kEnumCounterAudioSrtpCipher,
  kEnumCounterAudioSslCipher,
  kEnumCounterVideoSrtpCipher,
  kEnumCounterVideoSslCipher,
  kEnumCounterDataSrtpCipher,
  kEnumCounterDataSslCipher,
  kEnumCounterDtlsHandshakeError,
  kEnumCounterIceRegathering,
  kEnumCounterIceRestart,
  kEnumCounterKeyProtocol,
  kEnumCounterSdpSemanticRequested,
  kEnumCounterSdpSemanticNegotiated,
  kEnumCounterKeyProtocolMediaType,
  kEnumCounterSdpFormatReceived,
  // The next 2 counters log the value of srtp_err_status_t defined in libsrtp.
  kEnumCounterSrtpUnprotectError,
  kEnumCounterSrtcpUnprotectError,
  kEnumCounterUsagePattern,
  kPeerConnectionEnumCounterMax
};

// Currently this contains information related to WebRTC network/transport
// information.

// The difference between PeerConnectionEnumCounter and
// PeerConnectionMetricsName is that the "EnumCounter" is only counting the
// occurrences of events, while "Name" has a value associated with it which is
// used to form a histogram.

// This enum is backed by Chromium's histograms.xml,
// chromium/src/tools/metrics/histograms/histograms.xml
// Existing values cannot be re-ordered and new enums must be added
// before kBoundary.
enum PeerConnectionAddressFamilyCounter {
  kPeerConnection_IPv4,
  kPeerConnection_IPv6,
  kBestConnections_IPv4,
  kBestConnections_IPv6,
  kPeerConnectionAddressFamilyCounter_Max,
};

// TODO(guoweis): Keep previous name here until all references are renamed.
#define kBoundary kPeerConnectionAddressFamilyCounter_Max

// TODO(guoweis): Keep previous name here until all references are renamed.
typedef PeerConnectionAddressFamilyCounter PeerConnectionUMAMetricsCounter;

// This enum defines types for UMA samples, which will have a range.
enum PeerConnectionMetricsName {
  kNetworkInterfaces_IPv4,  // Number of IPv4 interfaces.
  kNetworkInterfaces_IPv6,  // Number of IPv6 interfaces.
  kTimeToConnect,           // In milliseconds.
  kLocalCandidates_IPv4,    // Number of IPv4 local candidates.
  kLocalCandidates_IPv6,    // Number of IPv6 local candidates.
  kPeerConnectionMetricsName_Max
};

// TODO(guoweis): Keep previous name here until all references are renamed.
typedef PeerConnectionMetricsName PeerConnectionUMAMetricsName;

// The IceCandidatePairType has the format of
// <local_candidate_type>_<remote_candidate_type>. It is recorded based on the
// type of candidate pair used when the PeerConnection first goes to a completed
// state. When BUNDLE is enabled, only the first transport gets recorded.
enum IceCandidatePairType {
  // HostHost is deprecated. It was replaced with the set of types at the bottom
  // to report private or public host IP address.
  kIceCandidatePairHostHost,
  kIceCandidatePairHostSrflx,
  kIceCandidatePairHostRelay,
  kIceCandidatePairHostPrflx,
  kIceCandidatePairSrflxHost,
  kIceCandidatePairSrflxSrflx,
  kIceCandidatePairSrflxRelay,
  kIceCandidatePairSrflxPrflx,
  kIceCandidatePairRelayHost,
  kIceCandidatePairRelaySrflx,
  kIceCandidatePairRelayRelay,
  kIceCandidatePairRelayPrflx,
  kIceCandidatePairPrflxHost,
  kIceCandidatePairPrflxSrflx,
  kIceCandidatePairPrflxRelay,

  // The following 4 types tell whether local and remote hosts have private or
  // public IP addresses.
  kIceCandidatePairHostPrivateHostPrivate,
  kIceCandidatePairHostPrivateHostPublic,
  kIceCandidatePairHostPublicHostPrivate,
  kIceCandidatePairHostPublicHostPublic,
  kIceCandidatePairMax
};

enum KeyExchangeProtocolType {
  kEnumCounterKeyProtocolDtls,
  kEnumCounterKeyProtocolSdes,
  kEnumCounterKeyProtocolMax
};

enum KeyExchangeProtocolMedia {
  kEnumCounterKeyProtocolMediaTypeDtlsAudio,
  kEnumCounterKeyProtocolMediaTypeDtlsVideo,
  kEnumCounterKeyProtocolMediaTypeDtlsData,
  kEnumCounterKeyProtocolMediaTypeSdesAudio,
  kEnumCounterKeyProtocolMediaTypeSdesVideo,
  kEnumCounterKeyProtocolMediaTypeSdesData,
  kEnumCounterKeyProtocolMediaTypeMax
};

enum SdpSemanticRequested {
  kSdpSemanticRequestDefault,
  kSdpSemanticRequestPlanB,
  kSdpSemanticRequestUnifiedPlan,
  kSdpSemanticRequestMax
};

enum SdpSemanticNegotiated {
  kSdpSemanticNegotiatedNone,
  kSdpSemanticNegotiatedPlanB,
  kSdpSemanticNegotiatedUnifiedPlan,
  kSdpSemanticNegotiatedMixed,
  kSdpSemanticNegotiatedMax
};

// Metric which records the format of the received SDP for tracking how much the
// difference between Plan B and Unified Plan affect users.
enum SdpFormatReceived {
  // No audio or video tracks. This is worth special casing since it seems to be
  // the most common scenario (data-channel only).
  kSdpFormatReceivedNoTracks,
  // No more than one audio and one video track. Should be compatible with both
  // Plan B and Unified Plan endpoints.
  kSdpFormatReceivedSimple,
  // More than one audio track or more than one video track in the Plan B format
  // (e.g., one audio media section with multiple streams).
  kSdpFormatReceivedComplexPlanB,
  // More than one audio track or more than one video track in the Unified Plan
  // format (e.g., two audio media sections).
  kSdpFormatReceivedComplexUnifiedPlan,
  kSdpFormatReceivedMax
};

class MetricsObserverInterface : public rtc::RefCountInterface {
 public:
  // |type| is the type of the enum counter to be incremented. |counter|
  // is the particular counter in that type. |counter_max| is the next sequence
  // number after the highest counter.
  virtual void IncrementEnumCounter(PeerConnectionEnumCounterType type,
                                    int counter,
                                    int counter_max) = 0;

  // This is used to handle sparse counters like SSL cipher suites.
  // TODO(guoweis): Remove the implementation once the dependency's interface
  // definition is updated.
  virtual void IncrementSparseEnumCounter(PeerConnectionEnumCounterType type,
                                          int counter) = 0;

  virtual void AddHistogramSample(PeerConnectionMetricsName type,
                                  int value) = 0;
};

typedef MetricsObserverInterface UMAObserver;

}  // namespace webrtc

#endif  // API_UMAMETRICS_H_
