#include <functional>
#include <systemintfcmds.h>
#include <host-ipmid/ipmid-host-cmd.hpp>
#include <host-ipmid/ipmid-host-cmd-utils.hpp>
#include <utils.hpp>
#include <phosphor-logging/log.hpp>
#include <config.h>
#include <host-interface.hpp>
namespace phosphor
{
namespace host
{
namespace command
{

// When you see Base:: you know we're referencing our base class
namespace Base = sdbusplus::xyz::openbmc_project::Control::server;

// IPMI OEM command.
// https://github.com/openbmc/openbmc/issues/2082 for handling
// Non-OEM commands that need to send SMS_ATN
using OEMCmd = uint8_t;

// Map of IPMI OEM command to its equivalent interface command.
// This is needed when invoking the callback handler to indicate
// the status of the executed command.
static const std::map<OEMCmd, Host::Command> intfCommand = {
    {
        CMD_HEARTBEAT,
            Base::Host::Command::Heartbeat
    },
    {
        CMD_POWER,
            Base::Host::Command::SoftOff
    }
};

// Map of Interface command to its corresponding IPMI OEM command.
// This is needed when pushing IPMI commands to command manager's
// queue. The same pair will be returned when IPMI asks us
// why a SMS_ATN was sent
static const std::map<Host::Command, IpmiCmdData> ipmiCommand = {
    {
        Base::Host::Command::Heartbeat,
            std::make_pair(CMD_HEARTBEAT, 0x00)
    },
    {
        Base::Host::Command::SoftOff,
            std::make_pair(CMD_POWER, SOFT_OFF)
    }
};

// Called at user request
void Host::execute(Base::Host::Command command)
{
    using namespace phosphor::logging;

    log<level::INFO>("Pushing cmd on to queue",
            entry("CONTROL_HOST_CMD=%s",
                  convertForMessage(command)));

    auto cmd = std::make_tuple(ipmiCommand.at(command),
                        std::bind(&Host::commandStatusHandler,
                            this, std::placeholders::_1,
                                std::placeholders::_2));

    return ipmid_send_cmd_to_host(std::move(cmd));
}

// Called into by Command Manager
void Host::commandStatusHandler(IpmiCmdData cmd, bool status)
{
    // Need to convert <cmd> to the equivalent one mentioned in spec
    auto value = status ? Result::Success : Result::Failure;

    // Fire a signal
    this->commandComplete(intfCommand.at(std::get<0>(cmd)), value);
}

} // namespace command
} // namespace host
} // namepsace phosphor
