#pragma once

#include "common/instance_id.hpp"
#include "xyz/openbmc_project/Common/error.hpp"
#include "xyz/openbmc_project/PLDM/Requester/server.hpp"

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>

#include <map>

namespace pldm
{
namespace dbus_api
{

using RequesterIntf = sdbusplus::server::object_t<
    sdbusplus::xyz::openbmc_project::PLDM::server::Requester>;

/** @class Requester
 *  @brief OpenBMC PLDM.Requester implementation.
 *  @details A concrete implementation for the
 *  xyz.openbmc_project.PLDM.Requester DBus APIs.
 */
class Requester : public RequesterIntf
{
  public:
    Requester() = delete;
    Requester(const Requester&) = delete;
    Requester& operator=(const Requester&) = delete;
    Requester(Requester&&) = delete;
    Requester& operator=(Requester&&) = delete;
    virtual ~Requester() = default;

    /** @brief Constructor to put object onto bus at a dbus path.
     *  @param[in] bus - Bus to attach to.
     *  @param[in] path - Path to attach at.
     *  @param[in] db - The database to use for allocating instance IDs
     *  @note will throw TooManyResources() if there were no free instance IDs
     *  Throws std::system_category().default_error_condition if there is
     *  something wrong with the instance ID database.
     */
    Requester(sdbusplus::bus_t& bus, const std::string& path,
              InstanceIdDb& db) :
        RequesterIntf(bus, path.c_str()), pldmInstanceIdDb(db) {};

    /** @brief Implementation for RequesterIntf.GetInstanceId */
    uint8_t getInstanceId(uint8_t eid) override
    {
        int id;

        // Ideally we would be able to look up the TID for a given EID. We don't
        // have that infrastructure in place yet. So use the EID value for the
        // TID. This is an interim step towards the PLDM requester logic moving
        // into libpldm, and eventually this won't be needed.
        try
        {
            id = pldmInstanceIdDb.next(eid);
        }
        catch (const std::runtime_error& e)
        {
            throw sdbusplus::xyz::openbmc_project::Common::Error::
                TooManyResources();
        }

        return id;
    }

    /** @brief Mark an instance id as unused
     *  @param[in] eid - MCTP eid to which this instance id belongs
     *  @param[in] instanceId - PLDM instance id to be freed
     *  @note will throw std::runtime_error if the instance ID was not
     *  previously allocated.
     *  Throws std::system_category().default_error_condition if there is
     *  something wrong with the instance ID database.
     */
    void markFree(uint8_t eid, uint8_t instanceId)
    {
        pldmInstanceIdDb.free(eid, instanceId);
    }

  private:
    InstanceIdDb& pldmInstanceIdDb;
};

} // namespace dbus_api
} // namespace pldm
