#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
