#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
