#ifndef IDATA_MACHINE_HPP_
#define IDATA_MACHINE_HPP_

#include <Utilities/Extern.hpp>
#include <Side/Side.hpp>
#include <DataLink/DataLink.hpp>

/**
 * @brief Interface implemented by machines which output and receive through data cables.
 */
class IDataMachine
{
public:
    virtual ~IDataMachine() = default;

    /**
     * @brief Return the data input side.
     */
    virtual Side getDataInputSide() = 0;

    /**
     * Return the data output side. By default it is the same as the input side.
     */
    virtual Side getDataOutputSide();

    /**
     * @brief Called when an input rule is matched with the specified verb.
     *
     * By default does nothing.
     */
    virtual void onDataInputVerb(std::string verb);

    /**
     * @brief Return which channels are currently active.
     *
     * This gets called once per update. By default returns no active channels.
     */
    virtual DataLink::ChannelBitmap getActiveChannels();
};

#endif