#pragma once

#include "IModule.h"
#include "Parameter.h"
#include <vector>

namespace mdd
{
    class IProcessor: public  IModule{
    public:
        typedef std::shared_ptr<IProcessor> Ptr;

        virtual std::string addModule(std::shared_ptr<IModule> module) = 0;
        virtual void  removeModule(std::shared_ptr<IModule> module) = 0;

        virtual json addInput(std::shared_ptr<IInput> input) = 0;
        virtual json removeInput(std::shared_ptr<IInput> input) = 0;
        virtual json addOutput(std::shared_ptr<IOutput> output) = 0;
        virtual json removeOutput(std::shared_ptr<IOutput> output) = 0;

        virtual std::vector<std::shared_ptr<Parameter>>& getInputParams() = 0;
        virtual std::vector<std::shared_ptr<Parameter>>& getOutputParams() = 0;

        virtual std::vector<std::shared_ptr<IModule >>& getModules() = 0;
 
        virtual size_t getNumModuls() = 0;
        virtual std::shared_ptr<IModule> getModule(size_t index) = 0;
        virtual std::shared_ptr<IModule> getModule(const json& jid) = 0;
        virtual bool connect(const std::string& output_id, const std::vector<std::string>& input_ids) = 0;
    };
}
