#ifndef TESTBENCH_HEADERFILE
#define TESTBENCH_HEADERFILE

#include "AgentSlotOfTestbench.h"
#include "ChannelSlotOfTestbench.h"
#include "CSVreaderModule.h"
#include "SensorSlotOfTestbench.h"
#include "Unit.h"
#include <vector>

/*
#include "Agent.h"
#include "Channel.h"
#include "CSVreader.h"
#include "CSV_Writer.h"

#define MAX_NUM_OF_AGENTS 20
#define MAX_NUM_OF_CHANNELS 80
#define MAX_NUM_OF_SENSORS 20
*/

using namespace std;

class Testbench : public Module {

	private:
		//TODO: set- and get function for maxNumOf_registeredAgents;
		vector<AgentSlotOfTestbench*> vector_registeredAgents;
		unsigned int maxNumOf_registeredAgents;

		//TODO: set- and get function for maxNumOf_registeredChannels;
		vector<ChannelSlotOfTestbench*> vector_registeredChannels;
		unsigned int maxNumOf_registeredChannels;

		//TODO: set- and get function for maxNumOf_registeredSensors;
		vector<SensorSlotOfTestbench*> vector_registeredSensors;
		unsigned int maxNumOf_registeredSensors;

		void init_testbench();

	public:
		Testbench();
		Testbench(const char* name);

		bool register_agent(Agent* agent);

		bool register_sensor(Sensor* sensor);
		SensorSlotOfTestbench* get_sensorSlotAddressOfTestbench(Sensor* sensor);

		bool register_channel(Channel* channel);

		void simulate(unsigned int rounds);



	
	/*
	private:

		unsigned int num_of_registered_agents;
		Agent* registered_agents[MAX_NUM_OF_AGENTS];

		unsigned int num_of_registered_channels;
		Channel* registered_channels[MAX_NUM_OF_CHANNELS];

		unsigned int num_of_registered_sensors;
		Sensor* registered_sensors[MAX_NUM_OF_SENSORS];
		CSV_Reader* registered_sensors_csvr[MAX_NUM_OF_SENSORS];
		bool flag_sensor_has_csvr[MAX_NUM_OF_SENSORS];

		//csv
		CSV_Reader* csv_reader;
		bool flag_csv_reader_exist;

		CSV_Writer* csv_writer;
		bool flag_csv_writer_exist;

	public:
		Testbench();
		Testbench(char* name);

		void simulate();

		//for agents:
		unsigned int get_num_of_registered_agents();
		bool register_agent(Agent* agent);
		bool deregister_agent(Agent* agent);
		bool deregister_agent(unsigned int agent_ix);
		bool get_ix_of_agent(Agent* agent, unsigned int *agent_ix);

		//for sensors:
		unsigned int get_num_of_registered_sensors();
		bool register_sensor(Sensor* sensor);
		bool register_sensor(Sensor* sensor, CSV_Reader *csvr);
		bool deregister_sensor(Sensor* sensor);
		bool deregister_sensor(unsigned int sensor_ix);
		bool get_ix_of_sensor(Sensor* sensor, unsigned int *sensor_ix);
		bool get_flag_sensor_has_csvr(unsigned int sensor_ix);
		CSV_Reader* get_registered_sensors_csvr(unsigned int sensor_ix);
		CSV_Reader* get_registered_sensors_csvr(Sensor* sensor);



		//for channels:
		unsigned int get_num_of_registered_channels();
		bool register_channel(Channel* channel);
		bool deregister_channel(Channel* channel);
		bool deregister_channel(unsigned int channel_ix);
		bool get_ix_of_channel(Channel* channel, unsigned int *channel_ix);

		//csv
		bool register_csv_reader(CSV_Reader* csv_reader);
		bool register_csv_writer(CSV_Writer* csv_writer);
		*/
};


#endif
