#pragma once

#include <ipmid-host/cmd-utils.hpp>
#include <queue>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <sdbusplus/timer.hpp>
#include <tuple>

namespace phosphor
{
namespace host
{
namespace command
{

/** @class
 *  @brief Manages commands that are to be sent to Host
 */
class Manager
{
  public:
    Manager() = delete;
    ~Manager() = default;
    Manager(const Manager&) = delete;
    Manager& operator=(const Manager&) = delete;
    Manager(Manager&&) = delete;
    Manager& operator=(Manager&&) = delete;

    /** @brief Constructs Manager object
     *
     *  @param[in] bus   - dbus handler
     *  @param[in] event - pointer to sd_event
     */
    explicit Manager(sdbusplus::bus_t& bus);

    /** @brief  Extracts the next entry in the queue and returns
     *          Command and data part of it.
     *
     *  @detail Also calls into the registered handlers so that they can now
     *          send the CommandComplete signal since the interface contract
     *          is that we emit this signal once the message has been
     *          passed to the host (which is required when calling this)
     *
     *          Also, if the queue has more commands, then it will alert the
     *          host
     */
    IpmiCmdData getNextCommand();

    /** @brief  Pushes the command onto the queue.
     *
     *  @detail If the queue is empty, then it alerts the Host. If not,
     *          then it returns and the API documented above will handle
     *          the commands in Queue.
     *
     *  @param[in] command - tuple of <IPMI command, data, callback>
     */
    void execute(CommandHandler command);

  private:
    /** @brief Check if anything in queue and alert host if so */
    void checkQueueAndAlertHost();

    /** @brief  Call back interface on message timeouts to host.
     *
     *  @detail When this happens, a failure message would be sent
     *          to all the commands that are in the Queue and queue
     *          will be purged
     */
    void hostTimeout();

    /** @brief Clears the command queue
     *
     *  @detail Clears the command queue and calls all callbacks
     *          specifying the command wasn't successful.
     */
    void clearQueue();

    /** @brief Clears the command queue on a power on
     *
     *  @detail The properties changed handler for the
     *          RequestedHostTransition property.  When this property
     *          changes to 'On', this function will purge the command
     *          queue.
     *
     *          This is done to avoid having commands that were issued
     *          before the host powers on from getting sent to the host,
     *          either due to race conditions around state transitions
     *          or from a user doing something like requesting an already
     *          powered off system to power off again and then immediately
     *          requesting a power on.
     *
     *  @param[in] msg - the sdbusplus message containing the property
     */
    void clearQueueOnPowerOn(sdbusplus::message_t& msg);

    /** @brief Reference to the dbus handler */
    sdbusplus::bus_t& bus;

    /** @brief Queue to store the requested commands */
    std::queue<CommandHandler> workQueue{};

    /** @brief Timer for commands to host */
    phosphor::Timer timer;

    /** @brief Match handler for the requested host state */
    sdbusplus::bus::match_t hostTransitionMatch;
};

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