#pragma once
#include "bios_attribute.hpp"

#include <string>

class TestBIOSStringAttribute;

namespace pldm
{
namespace responder
{
namespace bios
{

/** @class BIOSStringAttribute
 *  @brief Associate string entry(attr table and attribute value table) and dbus
 *         attribute
 */
class BIOSStringAttribute : public BIOSAttribute
{
  public:
    friend class ::TestBIOSStringAttribute;

    /** @brief BIOS string types */
    enum class Encoding : uint8_t
    {
        UNKNOWN = 0x00,
        ASCII = 0x01,
        HEX = 0x02,
        UTF_8 = 0x03,
        UTF_16LE = 0x04,
        UTF_16BE = 0x05,
        VENDOR_SPECIFIC = 0xFF
    };

    /** brief Mapping of string to enum for string type */
    inline static const std::map<std::string, Encoding> strTypeMap{
        {"Unknown", Encoding::UNKNOWN},
        {"ASCII", Encoding::ASCII},
        {"Hex", Encoding::HEX},
        {"UTF-8", Encoding::UTF_8},
        {"UTF-16LE", Encoding::UTF_16LE},
        {"UTF-16LE", Encoding::UTF_16LE},
        {"Vendor Specific", Encoding::VENDOR_SPECIFIC}};

    /** @brief Construct a bios string attribute
     *  @param[in] entry - Json Object
     *  @param[in] dbusHandler - Dbus Handler
     */
    BIOSStringAttribute(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 string field from json */
    table::attribute::StringField stringInfo;

    /** @brief Get attribute value on dbus */
    std::string getAttrValue();
};

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