#pragma once

#include <hei_includes.hpp>
#include <isolator/hei_signature.hpp>

namespace libhei
{

/**
 * @brief The main isolate() API is given a list of chips to analyze. This class
 *        will contain a list of all active hardware errors found on those
 *        chips, the contents of any registers associated with the active
 *        errors, and any other data that can be useful for debug.
 */
class IsolationData
{
  public: // Constructors, destructor, assignment, etc.
    /** @brief Default constructor. */
    IsolationData() = default;

    /** @brief Destructor. */
    ~IsolationData() = default;

    /** @brief Copy constructor. */
    IsolationData(const IsolationData&) = default;

    /** @brief Assignment operator. */
    IsolationData& operator=(const IsolationData&) = default;

  private: // Instance variables
    /** A list of all signatures found during isolation. */
    std::vector<Signature> iv_sigLists;

    // TODO: add register dump.

  public: // Member functions
    /**
     * @brief Adds a signature to the signature list.
     * @param i_signature The target signature.
     */
    void addSignature(const Signature& i_signature)
    {
        iv_sigLists.push_back(i_signature);
    }

    /** @brief Allows access to the signature list. */
    const std::vector<Signature>& getSignatureList()
    {
        return iv_sigLists;
    }

    /** @brief Flushes the data to ensure a clean slate for isolation. */
    void flush()
    {
        iv_sigLists.clear();
    }

}; // end class IsolationData

} // end namespace libhei
