/*
 *  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_STRING_ENCODE_H_
#define RTC_BASE_STRING_ENCODE_H_

#include <stddef.h>

#include <optional>
#include <string>
#include <type_traits>
#include <vector>

#include "absl/base/macros.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "rtc_base/checks.h"
#include "rtc_base/string_to_number.h"
#include "rtc_base/strings/string_format.h"

namespace webrtc {

inline std::string BoolToString(bool b) {
  return b ? "true" : "false";
}

std::string hex_encode(absl::string_view str);
std::string hex_encode_with_delimiter(absl::string_view source, char delimiter);

// hex_decode converts ascii hex to binary.
size_t hex_decode(rtc::ArrayView<char> buffer, absl::string_view source);

// hex_decode, assuming that there is a delimiter between every byte
// pair.
// `delimiter` == 0 means no delimiter
// If the buffer is too short or the data is invalid, we return 0.
size_t hex_decode_with_delimiter(rtc::ArrayView<char> buffer,
                                 absl::string_view source,
                                 char delimiter);

// Splits the source string into multiple fields separated by delimiter,
// with duplicates of delimiter creating empty fields. Empty input produces a
// single, empty, field.
std::vector<absl::string_view> split(absl::string_view source, char delimiter);

// Splits the source string into multiple fields separated by delimiter,
// with duplicates of delimiter ignored.  Trailing delimiter ignored.
size_t tokenize(absl::string_view source,
                char delimiter,
                std::vector<std::string>* fields);

// Extract the first token from source as separated by delimiter, with
// duplicates of delimiter ignored. Return false if the delimiter could not be
// found, otherwise return true.
bool tokenize_first(absl::string_view source,
                    char delimiter,
                    std::string* token,
                    std::string* rest);

// Versions that behave differently from StrCat

// Versions not supported by StrCat:

template <typename T,
          typename std::enable_if<std::is_arithmetic<T>::value &&
                                      !std::is_same<T, bool>::value,
                                  int>::type = 0>
static bool FromString(absl::string_view s, T* t) {
  RTC_DCHECK(t);
  std::optional<T> result = webrtc::StringToNumber<T>(s);

  if (result)
    *t = *result;

  return result.has_value();
}

bool FromString(absl::string_view s, bool* b);

template <typename T>
static inline T FromString(absl::string_view str) {
  T val;
  FromString(str, &val);
  return val;
}

//////////////////////////////////////////////////////////////////////

}  //  namespace webrtc

// Re-export symbols from the webrtc namespace for backwards compatibility.
// TODO(bugs.webrtc.org/4222596): Remove once all references are updated.
namespace rtc {
using ::webrtc::FromString;
using ::webrtc::hex_decode;
using ::webrtc::hex_decode_with_delimiter;
using ::webrtc::hex_encode;
using ::webrtc::hex_encode_with_delimiter;
using ::webrtc::split;
using ::webrtc::tokenize;
using ::webrtc::tokenize_first;

namespace internal {
template <typename T, typename = void>
struct is_absl_strcat_callable : std::false_type {};

template <typename T>
struct is_absl_strcat_callable<
    T,
    std::void_t<decltype(absl::StrCat(std::declval<T>()))>> : std::true_type {};
}  // namespace internal

template <typename T>
ABSL_DEPRECATE_AND_INLINE()
inline auto ToString(T value) ->
    typename std::enable_if<!std::is_same_v<T, bool> &&
                                internal::is_absl_strcat_callable<T>::value,
                            std::string>::type {
  return absl::StrCat(value);
}

template <typename T>
ABSL_DEPRECATE_AND_INLINE()
inline auto ToString(T p) ->
    typename std::enable_if<!internal::is_absl_strcat_callable<T>::value &&
                                std::is_pointer<T>::value,
                            std::string>::type {
  return webrtc::StringFormat("%p", p);
}

template <typename T>
ABSL_DEPRECATE_AND_INLINE()
inline auto ToString(T value) ->
    typename std::enable_if<!std::is_pointer_v<T> && std::is_same_v<T, bool>,
                            std::string>::type {
  return webrtc::BoolToString(value);
}

}  // namespace rtc

#endif  // RTC_BASE_STRING_ENCODE_H__
