/*
 *  Copyright 2004 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 RTC_BASE_NETWORK_CONSTANTS_H_
#define RTC_BASE_NETWORK_CONSTANTS_H_

#include <stdint.h>

#include <string>

#include "absl/strings/string_view.h"

namespace webrtc {

constexpr uint16_t kNetworkCostMax = 999;
constexpr uint16_t kNetworkCostCellular2G = 980;
constexpr uint16_t kNetworkCostCellular3G = 910;
constexpr uint16_t kNetworkCostCellular = 900;
constexpr uint16_t kNetworkCostCellular4G = 500;
constexpr uint16_t kNetworkCostCellular5G = 250;
constexpr uint16_t kNetworkCostUnknown = 50;
constexpr uint16_t kNetworkCostLow = 10;
constexpr uint16_t kNetworkCostMin = 0;

// Add 1 to network cost of underlying network type
// so that e.g a "plain" WIFI is prefered over a VPN over WIFI
// everything else being equal.
constexpr uint16_t kNetworkCostVpn = 1;

// TODO: bugs.webrtc.org/466507512 - network slices are not currently
// differentiated so as to reduce the possibility of collisions amongst network
// costs. Differentiation may require a more extensible approach.

// Add -2 to the network cost when using network slicing so that e.g. premium 5G
// slice is preferred over regular 5G, everything else being equal.
constexpr uint16_t kNetworkCostSlice = -2;

// Aliases for correct wrap-around with network slice cost.
constexpr uint16_t kNetworkCostCellular5GSlice =  // 248
    static_cast<uint16_t>(kNetworkCostCellular5G + kNetworkCostSlice);
constexpr uint16_t kNetworkCostCellular5GVpnSlice =  // 249
    static_cast<uint16_t>(kNetworkCostCellular5G + kNetworkCostVpn +
                          kNetworkCostSlice);
constexpr uint16_t kNetworkCostCellularSlice =  // 898
    static_cast<uint16_t>(kNetworkCostCellular + kNetworkCostSlice);
constexpr uint16_t kNetworkCostCellularVpnSlice =  // 899
    static_cast<uint16_t>(kNetworkCostCellular + kNetworkCostVpn +
                          kNetworkCostSlice);

// alias
constexpr uint16_t kNetworkCostHigh = kNetworkCostCellular;

enum AdapterType {
  // This enum resembles the one in Chromium net::ConnectionType.
  ADAPTER_TYPE_UNKNOWN = 0,
  ADAPTER_TYPE_ETHERNET = 1 << 0,
  ADAPTER_TYPE_WIFI = 1 << 1,
  ADAPTER_TYPE_CELLULAR = 1 << 2,  // This is CELLULAR of unknown type.
  ADAPTER_TYPE_VPN = 1 << 3,
  ADAPTER_TYPE_LOOPBACK = 1 << 4,
  // ADAPTER_TYPE_ANY is used for a network, which only contains a single "any
  // address" IP address (INADDR_ANY for IPv4 or in6addr_any for IPv6), and can
  // use any/all network interfaces. Whereas ADAPTER_TYPE_UNKNOWN is used
  // when the network uses a specific interface/IP, but its interface type can
  // not be determined or not fit in this enum.
  ADAPTER_TYPE_ANY = 1 << 5,
  ADAPTER_TYPE_CELLULAR_2G = 1 << 6,
  ADAPTER_TYPE_CELLULAR_3G = 1 << 7,
  ADAPTER_TYPE_CELLULAR_4G = 1 << 8,
  ADAPTER_TYPE_CELLULAR_5G = 1 << 9
};

std::string AdapterTypeToString(AdapterType type);

// Useful for testing!
constexpr AdapterType kAllAdapterTypes[] = {
    ADAPTER_TYPE_UNKNOWN,     ADAPTER_TYPE_ETHERNET,
    ADAPTER_TYPE_WIFI,        ADAPTER_TYPE_CELLULAR,
    ADAPTER_TYPE_VPN,         ADAPTER_TYPE_LOOPBACK,
    ADAPTER_TYPE_ANY,         ADAPTER_TYPE_CELLULAR_2G,
    ADAPTER_TYPE_CELLULAR_3G, ADAPTER_TYPE_CELLULAR_4G,
    ADAPTER_TYPE_CELLULAR_5G,
};

// Network slice is a property of a network, primarily used in 5G and beyond.
// It allows for the creation of multiple logical networks on a shared physical
// infrastructure, each optimized for specific use cases. This is not about
// whether the network is 3G/4G/5G/6G, but rather a feature available within
// some of those network generations (e.g., 5G).
enum class NetworkSlice {
  NO_SLICE = 0,
  UNIFIED_COMMUNICATIONS = 1,
};

absl::string_view NetworkSliceToString(NetworkSlice network_slice);

}  //  namespace webrtc


#endif  // RTC_BASE_NETWORK_CONSTANTS_H_
