#pragma once

#include "bios_attribute.hpp"

class TestBIOSIntegerAttribute;

namespace pldm
{
namespace responder
{
namespace bios
{

/** @class BIOSIntegerAttribute
 *  @brief Associate integer entry(attr table and attribute value table) and
 *         dbus attribute
 */
class BIOSIntegerAttribute : public BIOSAttribute
{
  public:
    friend class ::TestBIOSIntegerAttribute;

    /** @brief Construct a bios integer attribute
     *  @param[in] entry - Json Object
     *  @param[in] dbusHandler - Dbus Handler
     */
    BIOSIntegerAttribute(const Json& entry,
                         pldm::utils::DBusHandler* const dbusHandler);

    /** @brief Set Attribute value On Dbus according to the attribute value
     *         entry
     *  @param[in] attrValueEntry - The attribute value entry
     *  @param[in] attrEntry - The attribute entry corresponding to the
     *                         attribute value entry
     *  @param[in] stringTable - The string table
     */
    void setAttrValueOnDbus(
        const pldm_bios_attr_val_table_entry* attrValueEntry,
        const pldm_bios_attr_table_entry* attrEntry,
        const BIOSStringTable& stringTable) override;

    /** @brief Construct corresponding entries at the end of the attribute table
     *         and attribute value tables
     *  @param[in] stringTable - The string Table
     *  @param[in,out] attrTable - The attribute table
     *  @param[in,out] attrValueTable - The attribute value table
     *  @param[in,out] optAttributeValue - init value of the attribute
     */
    void constructEntry(const BIOSStringTable& stringTable, Table& attrTable,
                        Table& attrValueTable,
                        std::optional<std::variant<int64_t, std::string>>
                            optAttributeValue = std::nullopt) override;

    /** @brief Generate attribute entry by the spec DSP0247_1.0.0 Table 14
     *  @param[in] attributevalue - attribute value(Enumeration, String and
     *             Integer)
     *  @param[in,out] attrValueEntry - attribute entry
     */
    void generateAttributeEntry(
        const std::variant<int64_t, std::string>& attributevalue,
        Table& attrValueEntry) override;

    int updateAttrVal(Table& newValue, uint16_t attrHdl, uint8_t attrType,
                      const pldm::utils::PropertyValue& newPropVal) override;

  private:
    /** @brief Integer field from json */
    table::attribute::IntegerField integerInfo;

    /** @brief Get pldm value from dbus propertyValue */
    uint64_t getAttrValue(const pldm::utils::PropertyValue& value);

    /** @brief Get value on dbus */
    uint64_t getAttrValue();
};

} // namespace bios
} // namespace responder
} // namespace pldm
