#pragma once

#include <analyzer/resolution.hpp>
#include <hei_main.hpp>
#include <nlohmann/json.hpp>

#include <map>

namespace analyzer
{
/**
 * @brief Manages the RAS data files and resolves service actions required for
 *        error signatures.
 */
class RasDataParser
{
  public:
    /** @brief Default constructor. */
    RasDataParser()
    {
        initDataFiles();
    }

    /** Define all RAS data flags that may be associated with a signature */
    enum RasDataFlags
    {
        SUE_SOURCE,
        SUE_SEEN,
        CS_POSSIBLE,
        RECOVERED_ERROR,
        INFORMATIONAL_ONLY,
        MNFG_INFORMATIONAL_ONLY,
        MASK_BUT_DONT_CLEAR,
        CRC_RELATED_ERR,
        CRC_ROOT_CAUSE,
        ODP_DATA_CORRUPT_SIDE_EFFECT,
        ODP_DATA_CORRUPT_ROOT_CAUSE,
        ATTN_FROM_OCMB,
    };

  private:
    /** @brief The RAS data files. */
    std::map<libhei::ChipType_t, nlohmann::json> iv_dataFiles;

  public:
    /**
     * @brief Returns a resolution for all the RAS actions needed for the given
     *        signature.
     * @param i_signature The target error signature.
     */
    std::shared_ptr<Resolution>
        getResolution(const libhei::Signature& i_signature);

    /**
     * @brief Initializes the signature list within the input isolation data
     *        with their appropriate flags based on the RAS data files.
     * @param i_signature The target error signature.
     * @param i_flag      The flag to check for
     * @return True if the flag is set for the given signature, else false.
     */
    bool isFlagSet(const libhei::Signature& i_signature,
                   const RasDataFlags i_flag) const;

    /**
     * @brief Returns of the version of the relevant RAS data file for the
     *        input signature.
     * @param i_signature The target error signature.
     * @return The version of the RAS data file.
     */
    unsigned int getVersion(const libhei::Signature& i_signature) const;

  private:
    /**
     * @brief Parses all of the RAS data JSON files and validates them against
     *        the associated schema.
     */
    void initDataFiles();

    /**
     * @brief  Parses a signature in the given data file and returns a string
     *         representing the target action for the signature.
     * @param  i_data      The parsed RAS data file associated with the
     *                     signature's chip type.
     * @param  i_signature The target signature.
     * @return A string representing the target action for the signature.
     */
    std::string parseSignature(const nlohmann::json& i_data,
                               const libhei::Signature& i_signature) const;

    /**
     * @brief  Parses a bus object in the given data file and returns the bus
     *         type and unit path.
     * @param  i_data The parsed RAS data file associated with the signature's
     *                chip type.
     * @param  i_name The name of the target bus.
     * @return A tuple containing the bus type and unit path.
     */
    std::tuple<callout::BusType, std::string>
        parseBus(const nlohmann::json& i_data, const std::string& i_name);

    /**
     * @brief  Parses an action in the given data file and returns the
     *         corresponding resolution.
     * @param  i_data   The parsed RAS data file associated with the signature's
     *                  chip type.
     * @param  i_action The target action to parse from the given RAS data.
     * @return A resolution (or nested resolutions) representing the given
     *         action.
     * @note   This function is called recursively because an action could
     *         reference another action. This function will maintain a stack of
     *         parsed actions and will assert that the same action cannot be
     *         parsed more than once in the recursion stack.
     */
    std::shared_ptr<Resolution> parseAction(const nlohmann::json& i_data,
                                            const std::string& i_action);

    /**
     * @brief  Returns a callout priority enum value for the given string.
     * @param  i_priority The priority string.
     * @return A callout priority enum value.
     */
    callout::Priority getPriority(const std::string& i_priority);
};

} // namespace analyzer
