#pragma once

#include <cstdint>
#include <memory>
#include <optional>
#include <span>
#include <unordered_map>
#include <vector>

namespace bios_bmc_smm_error_logger
{
namespace rde
{

/**
 * @brief Resource ID for the annotation dictionary. The other entity
 * communicating with the BMC (Eg: BIOS) should use the same resource ID for the
 * annotation dictionary.
 */
constexpr uint32_t annotationResourceId = 0;

/**
 * @brief Holds an RDE BEJ dictionary entry.
 */
struct DictionaryEntry
{
    DictionaryEntry(bool valid, const std::span<const uint8_t> data) :
        valid(valid), data(data.begin(), data.end())
    {}
    // True indicates that the dictionary data is ready to be used.
    bool valid;
    std::vector<uint8_t> data;
};

/**
 * @brief Manages RDE BEJ dictionaries.
 */
class DictionaryManager
{
  public:
    DictionaryManager();

    /**
     * @brief Starts a dictionary entry with the provided data.
     *
     * @param[in] resourceId - PDR resource id corresponding to the dictionary.
     * @param[in] data - dictionary data.
     */
    void startDictionaryEntry(uint32_t resourceId,
                              const std::span<const uint8_t> data);

    /**
     * @brief Set the dictionary valid status. Until this is called, dictionary
     * data is considered to be incomplete for use.
     *
     * @param[in] resourceId - PDR resource id corresponding to the dictionary.
     * @return true if successful.
     */
    bool markDataComplete(uint32_t resourceId);

    /**
     * @brief Add more dictionary data for an existing entry. Adding data to a
     * completed dictionary will mark the dictionary as incomplete.
     *
     * @param[in] resourceId - PDR resource id corresponding to the dictionary.
     * @param[in] data - dictionary data.
     * @return true if successful.
     */
    bool addDictionaryData(uint32_t resourceId,
                           const std::span<const uint8_t> data);

    /**
     * @brief Get a dictionary.
     *
     * @param[in] resourceId - PDR resource id corresponding to the dictionary.
     * @return a pointer to the dictionary, if the dictionary is complete else
     * std::nullopt.
     */
    std::optional<std::span<const uint8_t>> getDictionary(uint32_t resourceId);

    /**
     * @brief Get the annotation dictionary.
     *
     * @return a pointer to the annotation dictionary, if the dictionary is
     * complete else std::nullopt.
     */
    std::optional<std::span<const uint8_t>> getAnnotationDictionary();

    /**
     * @brief Get the completed dictionary count.
     *
     * @return number of completed dictionaries available.
     */
    uint32_t getDictionaryCount();

    /**
     * @brief Invalidate all dictionaries.
     */
    void invalidateDictionaries();

  private:
    uint32_t validDictionaryCount;
    std::unordered_map<uint32_t, std::unique_ptr<DictionaryEntry>> dictionaries;

    /**
     * @brief Set a dictionary entry to be invalid and reduce the valid
     * dictionary count.
     *
     * @param[in] entry - A dictionary entry.
     */
    void invalidateDictionaryEntry(DictionaryEntry& entry);

    /**
     * @brief Set the dictionary entry valid flag and increase the valid
     * dictionary count.
     *
     * @param[in] entry - A dictionary entry.
     */
    void validateDictionaryEntry(DictionaryEntry& entry);
};

} // namespace rde
} // namespace bios_bmc_smm_error_logger
