#ifndef SETUPAGENT_HEADERFILE
#define SETUPAGENT_HEADERFILE

#include "Agent.h"
#include "Channel.h"
#include "Sensor.h"
//#include "SetupMountedAgent.h"
#include "SetupMountedHistoryModule.h"
#include "SetupMountedSensor.h"
#include "SetupStabilityModule.h"
#include "SlaveAgentSlotOfAgent.h"
#include <vector>

class SetupAgent {

private:
	Agent* agent;	//itself
	
	SlaveAgentSlotOfAgent* agentSlot;

	Agent* masterAgent;

	Channel* channel;

	//vector<SetupMountedAgent*> vMountedAgents;
	vector<SetupAgent*> vMountedAgents;
	vector<SetupMountedHistoryModule*> vMountedHistoryModules;
	vector<SetupStabilityModule*> vMountedStabilityModules;

	//TODO: SetupMountedSensor -> SetupSensor
	vector<SetupMountedSensor*> vMountedSensors;

public:
	SetupAgent();
	SetupAgent(Agent* agent);
	SetupAgent(Agent* agent, Channel* channel);

	bool setAgent(Agent* agent);
	bool masterAgentIsSet();
	Agent* getAgent();

	bool setMasterAgent(Agent* masterAgent, Channel* channel);
	Agent* getMasterAgent();
	

	bool mountAgent(Agent* agent, Channel* channel);
	bool agentIsMounted(Agent* agent);
	SetupAgent* getMountedAgent(Agent* agent);
	SetupAgent* getMountedAgent(Channel* channel);

	/*
	bool mountAgent(Agent* agent, Channel* channel);
	bool agentIsMounted(Agent* agent);
	SetupMountedAgent* getMountedAgent(Agent* agent);
	SetupMountedAgent* getMountedAgent(Channel* channel);
	*/

	bool mountSensor(Sensor* sensor, Channel* channel);
	bool sensorIsMounted(Sensor* sensor);
	SetupMountedSensor* getMountedSensor(Sensor* sensor);
	SetupMountedSensor* getMountedSensor(Channel* channel);

	bool mountHistoryModule(SetupMountedHistoryModule* mountedHistoryModule);
	bool historyModuleIsMounted(HistoryModule* historyModule);
	bool historyModuleIsMounted(SetupMountedHistoryModule* historyModule);
	SetupMountedHistoryModule* getMountedHistoryModule(HistoryModule* historyModule);

	bool mountStabilityModule(SetupStabilityModule* mountedStabilityModule);
	bool stabilityModuleIsMounted(StabilityModule* stabilityModule);
	bool stabilityModuleIsMounted(SetupStabilityModule* setupStabilityModule);
	SetupStabilityModule* getStabilityModule(StabilityModule* stabilityModule);

	bool setChannel(Channel* channel);
	Channel* getChannel();

	bool setAgentSlot(SlaveAgentSlotOfAgent* agentSlot);
	SlaveAgentSlotOfAgent* getAgentSlot();

};

#endif