// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "buffet/string_utils.h"

#include <algorithm>
#include <string.h>
#include <utility>

#include <base/strings/string_util.h>

namespace buffet {
namespace string_utils {

std::vector<std::string> Split(const std::string& str,
                               char delimiter,
                               bool trim_whitespaces,
                               bool purge_empty_strings) {
  std::vector<std::string> tokens;
  if (delimiter == 0)
    return tokens;

  const char* sz = str.c_str();
  if (sz) {
    const char* szNext = strchr(sz, delimiter);
    while (szNext) {
      if (szNext != sz || !purge_empty_strings)
        tokens.emplace_back(sz, szNext - sz);
      sz = szNext + 1;
      szNext = strchr(sz, delimiter);
    }
    if (*sz != 0 || !purge_empty_strings)
      tokens.emplace_back(sz);
  }

  if (trim_whitespaces) {
    std::for_each(tokens.begin(), tokens.end(),
                  [](std::string& str) {  // NOLINT(runtime/references)
      base::TrimWhitespaceASCII(str, base::TRIM_ALL, &str); });
  }

  return tokens;
}

std::pair<std::string, std::string> SplitAtFirst(const std::string& str,
                                                 char delimiter,
                                                 bool trim_whitespaces) {
  std::pair<std::string, std::string> pair;
  if (delimiter == 0)
    return pair;

  const char* sz = str.c_str();
  const char* szNext = strchr(sz, delimiter);
  if (szNext) {
    pair.first = std::string(sz, szNext);
    pair.second = std::string(szNext + 1);
  } else {
    pair.first = str;
  }

  if (trim_whitespaces) {
    base::TrimWhitespaceASCII(pair.first, base::TRIM_ALL, &pair.first);
    base::TrimWhitespaceASCII(pair.second, base::TRIM_ALL, &pair.second);
  }

  return pair;
}

std::string Join(char delimiter, const std::vector<std::string>& strings) {
  return JoinString(strings, delimiter);
}

std::string Join(const std::string& delimiter,
                 const std::vector<std::string>& strings) {
  return JoinString(strings, delimiter);
}

std::string Join(char delimiter,
                 const std::string& str1, const std::string& str2) {
  return str1 + delimiter + str2;
}

std::string Join(const std::string& delimiter,
                 const std::string& str1, const std::string& str2) {
  return str1 + delimiter + str2;
}

}  // namespace string_utils
}  // namespace buffet
