#pragma once

#include <functional>
#include <unistd.h>
#include <tuple>

namespace phosphor
{
namespace host
{
namespace command
{
    /** @detail After sending SMS_ATN to the Host, Host comes down and
     *          asks why an 'SMS_ATN` was sent.
     *          BMC then sends 'There is a Message to be Read` as response.
     *          Host then comes down asks for Message and the specified
     *          commands and data would go as data conforming to IPMI spec.
     *
     *          Refer: 6.13.2 Send Message Command From System Interface
     *          in IPMI V2.0 spec.
     */

    /** @brief IPMI command */
    using IPMIcmd = uint8_t;

    /** @brief Data associated with command */
    using Data = uint8_t;

    /** @brief <IPMI command, Data> to be sent as payload when Host asks for
     *          the message that can be associated with the previous SMS_ATN
     */
    using IpmiCmdData = std::pair<IPMIcmd, Data>;

    /** @detail Implementation specific callback function to be invoked
     *          conveying the status of the executed command. Specific
     *          implementations may then broadcast an agreed signal
     */
    using CallBack = std::function<void(IpmiCmdData, bool)>;

    /** @detail Tuple encapsulating above 2 to enable using Manager by
     *          different implementations. Users of Manager will supply
     *          <Ipmi command, Data> along with the callback handler.
     *          Manager will invoke the handler onveying the status of
     *          the command.
     */
    using CommandHandler = std::tuple<IpmiCmdData, CallBack>;

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