// Copyright 2013 The Flutter 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 "flutter/fml/paths.h"

#include <sstream>

#include "flutter/fml/build_config.h"

namespace fml {
namespace paths {

std::string JoinPaths(std::initializer_list<std::string> components) {
  std::stringstream stream;
  size_t i = 0;
  const size_t size = components.size();
  for (const auto& component : components) {
    i++;
    stream << component;
    if (i != size) {
#if FML_OS_WIN
      stream << "\\";
#else   // FML_OS_WIN
      stream << "/";
#endif  // FML_OS_WIN
    }
  }
  return stream.str();
}

std::string SanitizeURIEscapedCharacters(const std::string& str) {
  std::string result;
  result.reserve(str.size());
  for (std::string::size_type i = 0; i < str.size(); ++i) {
    if (str[i] == '%') {
      if (i > str.size() - 3 || !isxdigit(str[i + 1]) ||
          !isxdigit(str[i + 2])) {
        return "";
      }
      const std::string hex = str.substr(i + 1, 2);
      const auto c =
          static_cast<const unsigned char>(strtoul(hex.c_str(), nullptr, 16));
      if (!c) {
        return "";
      }
      result += static_cast<std::basic_string<char>::value_type>(c);
      i += 2;
    } else {
      result += str[i];
    }
  }
  return result;
}

std::pair<bool, std::string> GetExecutableDirectoryPath() {
  auto path = GetExecutablePath();
  if (!path.first) {
    return {false, ""};
  }
  return {true, fml::paths::GetDirectoryName(path.second)};
}

}  // namespace paths
}  // namespace fml
