#pragma once

#include "errors.hpp"

#include <sdbusplus/message.hpp>

#include <algorithm>
#include <ranges>
#include <string_view>

namespace utils
{

namespace constants
{
constexpr std::string_view triggerDirStr =
    "/xyz/openbmc_project/Telemetry/Triggers/";
constexpr std::string_view reportDirStr =
    "/xyz/openbmc_project/Telemetry/Reports/";

constexpr std::string_view allowedCharactersInPath =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/";
constexpr size_t maxPrefixesInId = 1;
constexpr size_t maxPrefixLength{TELEMETRY_MAX_PREFIX_LENGTH};
constexpr size_t maxIdNameLength{TELEMETRY_MAX_ID_NAME_LENGTH};
constexpr size_t maxDbusPathLength{TELEMETRY_MAX_DBUS_PATH_LENGTH};

constexpr size_t maxTriggeFullIdLength{maxDbusPathLength -
                                       triggerDirStr.length()};
constexpr size_t maxReportFullIdLength{maxDbusPathLength -
                                       reportDirStr.length()};

static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <=
                  maxTriggeFullIdLength,
              "Misconfigured prefix/id/name lengths.");
static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <=
                  maxReportFullIdLength,
              "Misconfigured prefix/id/name lengths.");

const sdbusplus::message::object_path triggerDirPath =
    sdbusplus::message::object_path(std::string(triggerDirStr));
const sdbusplus::message::object_path reportDirPath =
    sdbusplus::message::object_path(std::string(reportDirStr));
} // namespace constants

inline bool isValidDbusPath(const std::string& path)
{
    return (path.find_first_not_of(constants::allowedCharactersInPath) ==
            std::string::npos) &&
           !path.ends_with('/');
}

inline void verifyIdCharacters(std::string_view id)
{
    if (id.find_first_not_of(utils::constants::allowedCharactersInPath) !=
        std::string::npos)
    {
        throw errors::InvalidArgument("Id", "Invalid character.");
    }
}

sdbusplus::message::object_path pathAppend(sdbusplus::message::object_path path,
                                           const std::string& appended);

std::string reportPathToId(const sdbusplus::message::object_path& path);

void verifyIdPrefixes(std::string_view id);

} // namespace utils
