#pragma once

#include "config.hpp"
#include "power_button_profile.hpp"

#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>

#include <algorithm>
#include <numeric>
#include <sstream>
#include <string>

namespace phosphor
{
namespace button
{
enum class PowerEvent
{
    powerPressed,
    resetPressed,
    powerReleased,
    resetReleased
};

enum class PwrCtl
{
    chassisOn,
    chassisOff,
    chassisCycle,
};

inline static size_t numberOfChassis()
{
    return instances.size();
}

/**
 * @class Handler
 *
 * This class acts on the signals generated by the
 * xyz.openbmc_project.Chassis.Buttons code when
 * it detects button presses.
 *
 * There are 3 buttons supported - Power, ID, and Reset.
 * As not all systems may implement each button, this class will
 * check for that button on D-Bus before listening for its signals.
 */
class Handler
{
  public:
    Handler() = delete;
    ~Handler() = default;
    Handler(const Handler&) = delete;
    Handler& operator=(const Handler&) = delete;
    Handler(Handler&&) = delete;
    Handler& operator=(Handler&&) = delete;

    /**
     * @brief Constructor
     *
     * @param[in] bus - sdbusplus connection object
     */
    explicit Handler(sdbusplus::bus_t& bus);

  private:
    /**
     * @brief The handler for a power button press
     *
     * It will do power action according to the pressing duration.
     *
     * @param[in] msg - sdbusplus message from signal
     */
    void powerReleased(sdbusplus::message_t& msg);

    /**
     * @brief The handler for an ID button press
     *
     * Toggles the ID LED group
     *
     * @param[in] msg - sdbusplus message from signal
     */
    void idReleased(sdbusplus::message_t& msg);

    /**
     * @brief The handler for a reset button press
     *
     * Reboots the host if it is powered on.
     *
     * @param[in] msg - sdbusplus message from signal
     */
    void resetReleased(sdbusplus::message_t& msg);

    /**
     * @brief The handler for a OCP debug card host selector button press
     *
     * In multi host system increases host position by 1 up to max host
     * position.
     *
     * @param[in] msg - sdbusplus message from signal
     */

    void debugHostSelectorReleased(sdbusplus::message_t& msg);

    /**
     * @brief Checks if system is powered on
     *
     * @return true if powered on, false else
     */
    bool poweredOn(size_t hostNumber) const;

    /*
     * @return std::string - the D-Bus service name if found, else
     *                       an empty string
     */
    std::string getService(const std::string& path,
                           const std::string& interface) const;

    /**
     * @brief gets the valid host selector value in multi host
     * system
     *
     * @return size_t throws exception if host selector position is
     * invalid or not available.
     */

    size_t getHostSelectorValue();
    /**
     * @brief increases the host selector position property
     * by 1 upto max host selector position
     *
     * @return void
     */

    void increaseHostSelectorPosition();
    /**
     * @brief checks if the system has multi host
     * based on the host selector property availability
     *
     * @return bool returns true if multi host system
     * else returns false.
     */
    bool isMultiHost();
    /**
     * @brief trigger the power ctrl event based on the
     *  button press event type.
     *
     * @return void
     */
    void handlePowerEvent(PowerEvent powerEventType,
                          const std::string& objectPath,
                          std::chrono::microseconds duration);

    /**
     * @brief sdbusplus connection object
     */
    sdbusplus::bus_t& bus;

    /**
     * @brief Matches on the power button released signal
     */
    std::unique_ptr<sdbusplus::bus::match_t> powerButtonReleased;

    /**
     * @brief Matches on the power button long press released signal
     */
    std::unique_ptr<sdbusplus::bus::match_t> powerButtonLongPressed;

    /**
     * @brief Matches on the multi power button released signal
     */
    std::vector<std::unique_ptr<sdbusplus::bus::match_t>>
        multiPowerButtonReleased;

    /**
     * @brief Matches on the ID button released signal
     */
    std::unique_ptr<sdbusplus::bus::match_t> idButtonReleased;

    /**
     * @brief Matches on the reset button released signal
     */
    std::unique_ptr<sdbusplus::bus::match_t> resetButtonReleased;

    /**
     * @brief Matches on the ocp debug host selector  button released signal
     */
    std::unique_ptr<sdbusplus::bus::match_t> debugHSButtonReleased;

    /**
     * @brief The custom power handler profile object.
     */
    std::unique_ptr<PowerButtonProfile> powerButtonProfile;

    /**
     * @brief Flag to indicate multi power button mode(false) or host select
     * button mode(true)
     */
    bool hostSelectButtonMode = false;

    /**
     * @brief Flag to indicate if the button supports multi action
     */
    bool isButtonMultiActionSupport = true;
};

} // namespace button
} // namespace phosphor
