#ifndef MDD_IModule_H
#define MDD_IModule_H

#include "IOutput.h"
#include "IInput.h"
#include "IProperty.h"
#include "state.h"
#include <string>
#include <vector>
#include <memory>

namespace mdd {
    class IOutput;

    class IModule : public IUnique, public IProperty{
    public:
        typedef std::shared_ptr<IModule> Ptr;

        virtual void updateID() = 0;
        virtual std::vector<std::string> getInputs() = 0;
        virtual std::vector<std::string> getOutputs() = 0;
        virtual std::vector<std::string> getInputIDs() = 0;
        virtual std::vector<std::string> getOutputIDs() = 0;
        virtual std::vector<state> getInputStates() = 0;
        virtual std::vector<state> getOutputStates() = 0;
        virtual std::shared_ptr<IOutput> getOutput(const std::string& output_id) = 0;
        virtual std::shared_ptr<IInput> getInput(const std::string& input_id) = 0;
        virtual std::vector <std::shared_ptr<IOutput>> getInputConnections() = 0;
        virtual std::vector <std::vector <std::shared_ptr<IInput>>> getOutputConnections() = 0;
        virtual std::vector <std::shared_ptr<IInput>> getOptimizableInputs() = 0;
        virtual std::vector <std::shared_ptr<IOutput>> getOptimizableOutputs() = 0;
        virtual state update() = 0;
        virtual ~IModule() = default;

        virtual void configure() = 0;
    };
}
#endif //MDD_IMODULE_H
