#include "grouplayout.hpp"
#include "ledlayout.hpp"

#include <phosphor-logging/lg2.hpp>
#include <sdbusplus/bus.hpp>

namespace phosphor
{
namespace led
{
namespace error
{
enum ConfigValidationError
{
    // An LED has different priorities assigned to it in different groups
    LedPriorityMismatch,

    // LED priority was needed but not assigned
    MissingLedPriority,

    // Mixup of the 2 configuration options
    MixedLedAndGroupPriority,

    // An invalid group priority was assigned
    InvalidGroupPriority,

    // Group priorities were not unique
    DuplicateGroupPriority,
};
}

class ConfigValidationException : std::runtime_error
{
  public:
    error::ConfigValidationError reason;

    ConfigValidationException(const error::ConfigValidationError& err,
                              const std::string& msg) :
        std::runtime_error(msg), reason(err)
    {
        lg2::error(msg.c_str());
    }

    ConfigValidationException(const error::ConfigValidationError& err,
                              const std::string& groupName,
                              const std::string& msg) :
        std::runtime_error(msg), reason(err)
    {
        lg2::error("Configuration Validation Error in Group {GROUP}: {MSG}",
                   "GROUP", groupName, "MSG", msg.c_str());
    }

    ConfigValidationException(const error::ConfigValidationError& err,
                              const std::string& groupName,
                              const std::string& ledName,
                              const std::string& msg) :
        std::runtime_error(msg), reason(err)
    {
        lg2::error(
            "Configuration Validation Error in Group {GROUP}, Led {LED}: {MSG}",
            "GROUP", groupName, "LED", ledName, "MSG", msg.c_str());
    }
};

void validateConfigV1(const phosphor::led::GroupMap& ledMap);

} // namespace led
} // namespace phosphor
