#include "mount_nodes.h"
#include <stdio.h>
#include "rlutil.h"


void mount_sensor_in_agent(Agent* agent, Sensor* sensor, Channel* sensor_to_slave) {
	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) && 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());
	}
	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);
	}
}


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, 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);
	}
}

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, 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);
	}
}




void mount_slaveagent_in_agent(Agent *masteragent, Agent* slaveagent, Channel* master_to_slave, Channel* slave_to_master) {
	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) && 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());
		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)\n", masteragent->get_name(), masteragent->get_id());
		rlutil::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);
	}
}