/*
 // Copyright (c) 2018 Intel Corporation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
 //      http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
 */
#ifndef THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_
#define THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_

#include <cstddef>
#include <cstdint>
#include <regex>  // NOLINT
#include <string>
#include <tuple>
#include <utility>
#include <variant>
#include <vector>

#include "boost/system/error_code.hpp"  // IWYU pragma: keep // NOLINT
#include "logging.hpp"
#include "sdbusplus/asio/property.hpp"  // NOLINT
#include "sdbusplus/message/native_types.hpp"

// IWYU pragma: no_include <stddef.h>
// IWYU pragma: no_include <stdint.h>
// IWYU pragma: no_include <boost/system/detail/error_code.hpp>

namespace dbus {

namespace utility {

// clang-format off
using DbusVariantType = std::variant<
    std::vector<std::tuple<std::string, std::string, std::string>>,
    std::vector<std::string>,
    std::vector<double>,
    std::string,
    int64_t,
    uint64_t,
    double,
    int32_t,
    uint32_t,
    int16_t,
    uint16_t,
    uint8_t,
    bool,
    sdbusplus::message::unix_fd,
    std::vector<uint32_t>,
    std::vector<uint16_t>,
    sdbusplus::message::object_path,
    std::tuple<uint64_t,
               std::vector<std::tuple<std::string, std::string, double,
                                      uint64_t>>>,
    std::tuple<uint64_t, std::vector<uint8_t>>,
    std::vector<std::tuple<std::string, std::string>>,
    std::vector<std::tuple<uint64_t, uint64_t, std::string>>,
    std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
    std::vector<std::tuple<uint32_t, size_t>>,
    std::vector<std::tuple<sdbusplus::message::object_path, std::string,
                           std::string, std::string>>,
    std::vector<std::tuple<size_t, size_t, size_t, std::string>>,
    // decomposition types
    std::tuple<std::string, std::string, std::string>,
    std::tuple<std::string, std::string>,
    std::tuple<uint32_t, std::vector<uint32_t>>,
    std::tuple<sdbusplus::message::object_path, std::string,
                           std::string, std::string>,
    std::tuple<uint32_t, size_t>
 >;

// clang-format on
using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>;
using ManagedObjectType =
    std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;

// Map of service name to list of interfaces
using MapperServiceMap =
    std::vector<std::pair<std::string, std::vector<std::string>>>;

// Map of object paths to MapperServiceMaps
using MapperGetSubTreeResponse =
    std::vector<std::pair<std::string, MapperServiceMap>>;

using MapperGetObject =
    std::vector<std::pair<std::string, std::vector<std::string>>>;

using MapperGetAncestorsResponse = std::vector<
    std::pair<std::string,
              std::vector<std::pair<std::string, std::vector<std::string>>>>>;

using MapperGetSubTreePathsResponse = std::vector<std::string>;

using MapperEndPoints = std::vector<std::string>;

using SystemdUnitStruct =
    std::tuple<std::string, std::string, std::string, std::string, std::string,
               std::string, sdbusplus::message::object_path, uint32_t,
               std::string, sdbusplus::message::object_path>;

// Return type for ListUnits as described in DBus API of systemd.
// https://www.freedesktop.org/wiki/Software/systemd/dbus
using SystemdListUnits = std::vector<SystemdUnitStruct>;

inline void escapePathForDbus(std::string& path) {
  const static std::regex reg("[^A-Za-z0-9_/]");  // NOLINT
  std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
}

inline void logError(const boost::system::error_code& ec) {
  if (ec) {
    BMCWEB_LOG_ERROR << "DBus error: " << ec << ", cannot call method";
  }
}

// gets the string N strings deep into a path
// i.e.  /0th/1st/2nd/3rd
bool getNthStringFromPath(const std::string& path, int index,
                          std::string& result);

}  // namespace utility
}  // namespace dbus
#endif  // THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_
