#pragma once

#include "occ_command.hpp"
#include "powermode.hpp"
#include "utils.hpp"

#include <org/open_power/OCC/PassThrough/server.hpp>
#include <phosphor-logging/log.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>

#include <format>
#include <string>

namespace open_power
{
namespace occ
{

using Iface = sdbusplus::server::object_t<
    sdbusplus::org::open_power::OCC::server::PassThrough>;

// For waiting on signals
namespace sdbusRule = sdbusplus::bus::match::rules;

/** @class PassThrough
 *  @brief Implements org.open_power.OCC.PassThrough
 */
class PassThrough : public Iface
{
  public:
    PassThrough() = delete;
    ~PassThrough() = default;
    PassThrough(const PassThrough&) = delete;
    PassThrough& operator=(const PassThrough&) = delete;
    PassThrough(PassThrough&&) = default;
    PassThrough& operator=(PassThrough&&) = default;

    /** @brief Ctor to put pass-through d-bus object on the bus
     *  @param[in] path - Path to attach at
     */
    explicit PassThrough(
        const char* path
#ifdef POWER10
        ,
        std::unique_ptr<open_power::occ::powermode::PowerMode>& powerModeRef
#endif
    );

    /** @brief Pass through command to OCC from dbus
     *  @param[in] command - command to pass-through
     *  @returns OCC response as an array
     */
    std::vector<std::int32_t> send(std::vector<std::int32_t> command) override;

    /** @brief Pass through command to OCC from openpower-occ-control
     *  @param[in] command - command to pass-through
     *  @returns OCC response as an array
     */
    std::vector<std::uint8_t> send(std::vector<std::uint8_t> command);

    /** @brief Set a Power Mode
     *
     *  @param[in] mode - desired System Power Mode
     *  @param[in] modeData - data associated some Power Modes
     *
     *  @returns true if mode change was accepted
     */
    bool setMode(const uint8_t mode, const uint16_t modeData);

  private:
    /** @brief Pass-through occ path on the bus */
    std::string path;

#ifdef POWER10
    /** @brief OCC PowerMode object */
    std::unique_ptr<open_power::occ::powermode::PowerMode>& pmode;
#endif

    /** @brief OCC device path
     *  For now, here is the hard-coded mapping until
     *  the udev rule is in.
     *  occ0 --> /dev/occ1
     *  occ1 --> /dev/occ2
     *  ...
     */
    std::string devicePath;

    /** @brief OCC instance number */
    int occInstance;

    /** @brief Indicates whether or not the OCC is currently active */
    bool occActive = false;

    /** @brief Subscribe to OCC Status signal
     *
     *  Once the OCC status gets to active, only then we will get /dev/occ2
     *  populated and hence need to wait on that before opening that
     */
    sdbusplus::bus::match_t activeStatusSignal;

    /** @brief Object to send commands to the OCC */
    OccCommand occCmd;

    /** @brief Callback function on OCC Status change signals
     *
     *  @param[in]  msg - Data associated with subscribed signal
     */
    void activeStatusEvent(sdbusplus::message_t& msg);
};

} // namespace occ
} // namespace open_power
