/*
 *  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,
  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
};

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) {}

  // 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);

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

typedef MetricsObserverInterface UMAObserver;

}  // namespace webrtc

#endif  // API_UMAMETRICS_H_
