#include "attach_modules.h"
#include "mount_nodes.h"
#include "rlutil.h"
#include <stdio.h>

using namespace rlutil;

bool mount_sensorInAgent(Agent* agent, Sensor* sensor, Channel* channel) {
	if(agent != NULL && sensor != NULL && channel != NULL) {
		printf(" > Sensor ");
		setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", sensor->get_name());
		setColor(TXTCOLOR_GREY);
		printf("(id: %03u) ", sensor->get_id());
		if(agent->get_sensorHandlerOfAgent()->mount_sensorIntoSensorSlot(channel) && sensor->mount_agent(channel)) {
			setColor(TXTCOLOR_LIGHTGREEN);
			printf("mounted ");
			setColor(TXTCOLOR_GREY);
			printf("in Agent ");
			setColor(TXTCOLOR_LIGHTCYAN);
			printf("%s ", agent->get_name());
			setColor(TXTCOLOR_GREY);
			printf("(id: %03u)\n", agent->get_id());
			return true;
		}
		else {
			setColor(TXTCOLOR_LIGHTRED);
			printf("couldn't be mounted in %s (id: %03u)\n", agent->get_name(), agent->get_id());
			setColor(TXTCOLOR_GREY);
		}
	}
	else {
		setColor(TXTCOLOR_LIGHTRED);
		printf(" > Agent, Sensor, or Channel is not valid\n");
		setColor(TXTCOLOR_GREY);
	}
	return false;
}
/*
void mount_sensor_in_agent(Agent* agent, Sensor* sensor, Channel* sensor_to_slave, unsigned int position) {
	printf(" > ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", sensor->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", sensor->get_id());

	if(agent->mount_sensor(sensor_to_slave, position) && sensor->mount_agent(sensor_to_slave)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", agent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - on position %u\n", agent->get_id(), position);
	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in %s (id: %03u) on position %u\n", agent->get_name(), agent->get_id(), position);
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/
/*
void mount_sensor_in_agent(Agent* agent, Sensor* sensor, Channel* sensor_to_slave, Abstraction* abstraction) {
	printf(" > ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", sensor->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", sensor->get_id());

	if(agent->mount_sensor(sensor_to_slave, abstraction) && sensor->mount_agent(sensor_to_slave)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", agent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", agent->get_id());
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("connected ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("with Abstraction Module ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", abstraction->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n", abstraction->get_id());

	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in %s (id: %03u) connected with Abstraction Module %s (id: %03u)\n", agent->get_name(), agent->get_id(), abstraction->get_name(), abstraction->get_id());
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/
/*
void mount_sensor_in_agent(Agent* agent, Sensor* sensor, Channel* sensor_to_slave, Confidence_Validator* confidence_validator) {
	printf(" > ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", sensor->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", sensor->get_id());

	if(agent->mount_sensor(sensor_to_slave, confidence_validator) && sensor->mount_agent(sensor_to_slave)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", agent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", agent->get_id());
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("connected ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("with Range of Validity ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", confidence_validator->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n", confidence_validator->get_id());
	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in %s (id: %03u) connected with Look up Table %s (id: %03u)\n", agent->get_name(), agent->get_id(), confidence_validator->get_name(), confidence_validator->get_id());
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/

bool mount_sensorInAgent(Agent* agent, Sensor* sensor, Channel* channel, HistoryModule* historyModule) {
	if(agent != NULL && sensor != NULL && channel != NULL && historyModule != NULL) {
		if(mount_sensorInAgent(agent, sensor, channel)) {
			return attach_historyModuleToSensorSlotInAgent(agent, sensor, channel, historyModule);
		}
	}
	else {
		setColor(TXTCOLOR_LIGHTRED);
		printf("Agent, Sensor, Channel, or HistoryModule is not valid\n");
		setColor(TXTCOLOR_GREY);
	}
	return false;
}

/*
void mount_sensor_in_agent(Agent* agent, Sensor* sensor, Channel* sensor_to_slave, Confidence_Validator* confidence_validator, Abstraction* abstraction) {
	printf(" > ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", sensor->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", sensor->get_id());

	if(agent->mount_sensor(sensor_to_slave, confidence_validator, abstraction) && sensor->mount_agent(sensor_to_slave)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", agent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", agent->get_id());
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("connected ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("with Range of Validity ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", confidence_validator->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", confidence_validator->get_id());
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("connected ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("with Abstraction Module ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", abstraction->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n", abstraction->get_id());

	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in %s (id: %03u) connected with Look up Table %s (id: %03u) and Abstraction Module %s (id: %03u)\n", agent->get_name(), agent->get_id(), confidence_validator->get_name(), confidence_validator->get_id(), abstraction->get_name(), abstraction->get_id());
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/

bool mount_agentInAgent(Agent *masteragent, Agent* slaveagent, Channel* channel) {
	if(masteragent != NULL && slaveagent != NULL && channel != NULL) {
		if(masteragent->get_slaveAgentHandlerOfAgent()->mount_slaveAgentIntoSlaveAgentSlot(channel)) {
			if(slaveagent->get_masterAgentHandlerOfAgent()->mount_masterAgentIntoSlaveAgentSlot(channel)) {
				printf(" > Agent ");
				setColor(TXTCOLOR_LIGHTCYAN);
				printf("%s ", slaveagent->get_name());
				setColor(TXTCOLOR_GREY);
				printf("(id: %03u) ", slaveagent->get_id());
				setColor(TXTCOLOR_LIGHTGREEN);
				printf("mounted ");
				setColor(TXTCOLOR_GREY);
				printf("in Agent ");
				setColor(TXTCOLOR_LIGHTCYAN);
				printf("%s ", masteragent->get_name());
				setColor(TXTCOLOR_GREY);
				printf("(id: %03u)\n", masteragent->get_id());
				return true;
			}
			else {
				setColor(TXTCOLOR_LIGHTRED);
				printf(" > Could not mount Master Agent %s (id: %03u) in Slave Agent %s (id: %03u)\n", masteragent->get_name(), masteragent->get_id(), slaveagent->get_name(), slaveagent->get_id());
				setColor(TXTCOLOR_GREY);
				masteragent->get_slaveAgentHandlerOfAgent()->demount_slaveAgentIntoSlaveAgentSlot(channel);
			}
		}
	}
	else {
		setColor(TXTCOLOR_LIGHTRED);
		printf(" > One of the Agents or Channel not valid\n");
		setColor(TXTCOLOR_GREY);
	}
	return false;






	/*
	if(masteragent->mount_slaveagent(slave_to_master, master_to_slave) && slaveagent->mount_masteragent(master_to_slave, slave_to_master)) {
		setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		setColor(TXTCOLOR_GREY);
		printf("in Agent ");
		setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", masteragent->get_name());
		setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n", masteragent->get_id());

		if(master_to_slave != NULL && slave_to_master != NULL) {
			printf("   > bidirectional communication ");
		}
		else {
			printf("   > unidirectional communication ");
			if(master_to_slave != NULL) {
				printf("(Master to Slave: ");
				rlutil::setColor(TXTCOLOR_LIGHTCYAN);
				printf("%s ", master_to_slave->get_name());
				rlutil::setColor(TXTCOLOR_GREY);
				printf("(id: %03u)) ", master_to_slave->get_id());
			}
			if(slave_to_master != NULL) {
				printf("(Slave to Master: ");
				rlutil::setColor(TXTCOLOR_LIGHTCYAN);
				printf("%s ", slave_to_master->get_name());
				rlutil::setColor(TXTCOLOR_GREY);
				printf("(id: %03u)) ", slave_to_master->get_id());
			}	
		}
		setColor(TXTCOLOR_LIGHTGREEN);
		printf("set\n");
		setColor(TXTCOLOR_GREY);
	}
	else {
		setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in Agent %s (id: %03u)\n", masteragent->get_name(), masteragent->get_id());
		setColor(TXTCOLOR_GREY);
	}
	*/
}

/*
void mount_slaveagent_in_agent(Agent *masteragent, Agent* slaveagent, Channel* master_to_slave, Channel* slave_to_master, unsigned int position) {
	printf(" > Slave - ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", slaveagent->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", slaveagent->get_id());

	if(masteragent->mount_slaveagent(slave_to_master, master_to_slave, position) && slaveagent->mount_masteragent(master_to_slave, slave_to_master)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in Master - ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", masteragent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - on position %u\n   - ", masteragent->get_id(), position);
		if(master_to_slave != NULL && slave_to_master != NULL)
			printf("bidirectional communication\n");
		else
			printf("unidirectional communication\n");
		if(master_to_slave != NULL) {
			printf("   - Master to Slave: ");
			rlutil::setColor(TXTCOLOR_LIGHTCYAN);
			printf("%s ", master_to_slave->get_name());
			rlutil::setColor(TXTCOLOR_GREY);
			printf("(id: %03u)\n", master_to_slave->get_id());
		}
		if(slave_to_master != NULL) {
			printf("   - Slave to Master: ");
			rlutil::setColor(TXTCOLOR_LIGHTCYAN);
			printf("%s ", slave_to_master->get_name());
			rlutil::setColor(TXTCOLOR_GREY);
			printf("(id: %03u)\n", slave_to_master->get_id());
		}	
	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in Master - %s (id: %03u) on position %u\n", masteragent->get_name(), masteragent->get_id(), position);
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/
/*
void mount_slaveagent_in_agent(Agent *masteragent, Agent* slaveagent, Channel* master_to_slave, Channel* slave_to_master, Cross_Confidence_Validator* ccv) {
	printf(" > Slave - ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", slaveagent->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", slaveagent->get_id());

	if(masteragent->mount_slaveagent(slave_to_master, master_to_slave, ccv) && slaveagent->mount_masteragent(master_to_slave, slave_to_master)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in Master - ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", masteragent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", masteragent->get_id());
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("connected ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("with Cross Confidence Validator ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", ccv->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n   - ", ccv->get_id());

		if(master_to_slave != NULL && slave_to_master != NULL)
			printf("bidirectional communication\n");
		else
			printf("unidirectional communication\n");
		if(master_to_slave != NULL) {
			printf("   - Master to Slave: ");
			rlutil::setColor(TXTCOLOR_LIGHTCYAN);
			printf("%s ", master_to_slave->get_name());
			rlutil::setColor(TXTCOLOR_GREY);
			printf("(id: %03u)\n", master_to_slave->get_id());
		}
		if(slave_to_master != NULL) {
			printf("   - Slave to Master: ");
			rlutil::setColor(TXTCOLOR_LIGHTCYAN);
			printf("%s ", slave_to_master->get_name());
			rlutil::setColor(TXTCOLOR_GREY);
			printf("(id: %03u)\n", slave_to_master->get_id());
		}	
	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in Master - %s (id: %03u) with Cross Confidence Validator %s (id: %03u)\n", masteragent->get_name(), masteragent->get_id(), ccv->get_name(), ccv->get_id());
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/
/*
void mount_bunchmodule_in_agent(Agent *agent, Bunch_Module* bunch_module) {
	printf(" > ");
	rlutil::setColor(TXTCOLOR_LIGHTCYAN);
	printf("%s ", bunch_module->get_name());
	rlutil::setColor(TXTCOLOR_GREY);
	printf("(id: %03u) ", bunch_module->get_id());

	if(agent->mount_bunch_module(bunch_module)) {
		rlutil::setColor(TXTCOLOR_LIGHTGREEN);
		printf("mounted ");
		rlutil::setColor(TXTCOLOR_GREY);
		printf("in ");
		rlutil::setColor(TXTCOLOR_LIGHTCYAN);
		printf("%s ", agent->get_name());
		rlutil::setColor(TXTCOLOR_GREY);
		printf("(id: %03u)\n", agent->get_id());
	}
	else {
		rlutil::setColor(TXTCOLOR_LIGHTRED);
		printf("couldn't be mounted in %s (id: %03u)\n", agent->get_name(), agent->get_id());
		rlutil::setColor(TXTCOLOR_GREY);
	}
}
*/
