#pragma once

#include <map>
#include <string>
#include <tuple>
#include <variant>
#include <vector>

/*
 * BIOS Parser API usage:
 *
 * 1) bios_parser::getStrings gets all the attribute names and the preconfigured
 *    strings used in representing the values of the attributes. This will be
 *    used to populate the BIOS String table.
 *
 * 2) bios_enum::setupValueLookup (similar API for other supported BIOS
 *    attribute types) has to be invoked to setup the lookup data structure for
 *    all the attributes of that type. This API needs to be invoked before
 *    invoking bios_enum::getValues and bios_enum::getAttrValue.
 *
 * 3) bios_enum::getValues is invoked to populate the BIOS attribute table for
 *    BIOSEnumeration and BIOSEnumerationReadonly types.(similar API for other
 *    BIOS attribute types)
 *
 * 4) bios_enum::getAttrValue will return the current values for the BIOS
 *    enumeration attribute. If there is no D-Bus mapping for the attribute then
 *    default value is returned.(similar API for other BIOS attribute types).
 *
 */

namespace bios_parser
{

using Strings = std::vector<std::string>;
inline constexpr auto bIOSEnumJson = "enum_attrs.json";
inline constexpr auto bIOSStrJson = "string_attrs.json";

/** @brief Parse every BIOS configuration JSON files in the directory path
 *         and populate all the attribute names and all the preconfigured
 *         strings used in representing the values of attributes.
 *
 *  @param[in] dirPath - directory path where all the BIOS configuration JSON
 *                      files exist.
 *
 *  @return all the strings that should be populated in the BIOS string table
 */
Strings getStrings(const char* dirPath);

namespace bios_enum
{

/** @brief Parse the JSON file specific to BIOSEnumeration and
 *         BIOSEnumerationReadOnly types and populate the data structure for
 *         the corresponding possible values and the default value. Setup the
 *         data structure to lookup the current value of the BIOS enumeration
 *         attribute. JSON is parsed once and the information is cached.
 *
 *  @param[in] dirPath - directory path where all the BIOS configuration JSON
 *                      exist
 *
 *  @return 0 for success and negative return code for failure
 */
int setupValueLookup(const char* dirPath);

using AttrName = std::string;
using IsReadOnly = bool;
using PossibleValues = std::vector<std::string>;
using DefaultValues = std::vector<std::string>;
using AttrValuesMap =
    std::map<AttrName, std::tuple<IsReadOnly, PossibleValues, DefaultValues>>;

/** @brief Get the possible values and the default values for the
 *         BIOSEnumeration and BIOSEnumerationReadOnly types
 *
 *  @return information needed to build the BIOS attribute table specific to
 *         BIOSEnumeration and BIOSEnumerationReadOnly types
 */
const AttrValuesMap& getValues();

using CurrentValues = std::vector<std::string>;

/** @brief Get the current values for the BIOS Attribute
 *
 *  @param[in] attrName - BIOS attribute name
 *
 *  @return BIOS attribute value
 */
CurrentValues getAttrValue(const AttrName& attrName);

} // namespace bios_enum

namespace bios_string
{

/** @brief Parse the JSON file specific to BIOSString and
 *         BIOSStringReadOnly types and populate the data structure for
 *         the corresponding possible values and the default value. Setup the
 *         data structure to lookup the current value of the BIOS string
 *         attribute. JSON is parsed once and the information is cached.
 *
 *  @param[in] dirPath - directory path where all the BIOS configuration JSON
 *                      exist
 *
 *  @return 0 for success and negative return code for failure
 */
int setupValueLookup(const char* dirPath);

using AttrName = std::string;
using IsReadOnly = bool;
using StrType = uint8_t;
using MinStrLen = uint16_t;
using MaxStrLen = uint16_t;
using DefaultStrLen = uint16_t;
using DefaultStr = std::string;
using AttrValuesMap =
    std::map<AttrName, std::tuple<IsReadOnly, StrType, MinStrLen, MaxStrLen,
                                  DefaultStrLen, DefaultStr>>;
/* attrTableSize is the sum of fixed length of members which construct a string
 * attribute table, including attr_handle(uint16_t), attr_type(uint8_t),
 * string_handle(uint16_t), strType(uint8_t), minStrLen(uint16_t),
 * MaxStrLen(uint16_t), DefaultStrLen(uint16_t) */
constexpr auto attrTableSize = 12;
static_assert(attrTableSize == sizeof(uint16_t) + sizeof(uint8_t) +
                                   sizeof(uint16_t) + sizeof(uint8_t) +
                                   sizeof(uint16_t) + sizeof(uint16_t) +
                                   sizeof(uint16_t));
/* attrValueTableSize is the sum of fixed length of members which construct a
 * string attribute value table, including attr_handle(uint16_t),
 * attr_type(uint8_t), CurrentStringLength(uint16_t)*/
constexpr auto attrValueTableSize = 5;
static_assert(attrValueTableSize ==
              sizeof(uint16_t) + sizeof(uint8_t) + sizeof(uint16_t));

/** @brief Get the string related values and the default values for the
 *         BIOSString and BIOSStringReadOnly types
 *
 *  @return information needed to build the BIOS attribute table specific to
 *         BIOSString and BIOSStringReadOnly types
 */
const AttrValuesMap& getValues();

/** @brief Get the current values for the BIOS Attribute
 *
 *  @param[in] attrName - BIOS attribute name
 *
 *  @return BIOS attribute value
 */
std::string getAttrValue(const AttrName& attrName);

} // namespace bios_string

} // namespace bios_parser
