#pragma once

#include <hei_includes.hpp>

namespace libhei
{

/**
 * @brief A signature represents an active attention from a single bit on a
 *        register within a chip.
 *
 * The isolator will gather a list of all active attentions on a chip and return
 * a list of signatures to the user application. The user application should be
 * able to determine what actions to take based on these signatures.
 */
class Signature
{
  public: // Constructors, destructor, assignment, etc.
    /**
     * @brief Constructor from components.
     * @param i_chip     The chip containing this register.
     * @param i_id       The register ID.
     * @param i_instance The instance of this register.
     * @param i_bit      The target bit within this register.
     * @param i_attnType The attention type reported by this bit.
     */
    Signature(const Chip& i_chip, RegisterId_t i_id,
              RegisterInstance_t i_instance, RegisterBit_t i_bit,
              AttentionType_t i_attnType) :
        iv_chip(i_chip),
        iv_id(i_id), iv_instance(i_instance), iv_bit(i_bit),
        iv_attnType(i_attnType)
    {}

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

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

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

  private: // Instance variables.
    Chip               iv_chip;     ///< Chip containing this register.
    RegisterId_t       iv_id;       ///< Register ID.
    RegisterInstance_t iv_instance; ///< Instance of this register.
    RegisterBit_t      iv_bit;      ///< Target bit within this register.
    AttentionType_t    iv_attnType; ///< Attention type reported by this bit.

  public: // Member functions
    /** @return The chip containing this register. */
    const Chip& getChip() const
    {
        return iv_chip;
    }

    /** @return The register ID. */
    RegisterId_t getId() const
    {
        return iv_id;
    }

    /** @return The instance of this register. */
    RegisterInstance_t getInstance() const
    {
        return iv_instance;
    }

    /** @return The target bit within this register. */
    RegisterBit_t getBit() const
    {
        return iv_bit;
    }

    /** @return The attention type reported by this bit. */
    AttentionType_t getAttnType() const
    {
        return iv_attnType;
    }
};

} // end namespace libhei
