#pragma once

#include <string>
#include <vector>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
#include "org/open_power/OCC/PassThrough/server.hpp"
#include "config.h"

namespace open_power
{
namespace occ
{
namespace pass_through
{

/** @brief Make occ pass-through d-bus object pathname
 *  @param[in] occ - occ name
 *  @returns occ pass-through path
 */
inline auto object(const std::string& occ)
{
    return std::string(OCC_PASS_THROUGH_ROOT) +
           '/' +
           occ;
}

/** @brief Put occ pass through objects on the bus
 */
void run();

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

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

        /** @brief Ctor to put pass-through d-bus object on the bus
         *  @param[in] bus - Bus to attach to
         *  @param[in] path - Path to attach at
         */
        PassThrough(sdbusplus::bus::bus& bus,
                    const char* path);

        /** @brief Pass through command to OCC
         *  @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;

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

} // namespace pass_through
} // namespace occ
} // namespace open_power
