#include "MasterAgentHandlerOfAgent.h"

#include "instruction_set_architecture.h"

#include <iostream>

#define MAX_BUFFER_LENGTH_MASTERAGENT_HANDLER 300

MasterAgentHandlerOfAgent :: MasterAgentHandlerOfAgent() {
	masterAgentSlotOfAgent = NULL;
	maxBufferLength = MAX_BUFFER_LENGTH_MASTERAGENT_HANDLER;
}

bool MasterAgentHandlerOfAgent :: mount_masterAgentIntoSlaveAgentSlot(Channel* comPort) {
	masterAgentSlotOfAgent = new MasterAgentSlotOfAgent();
	if(masterAgentSlotOfAgent != NULL) {
		if(masterAgentSlotOfAgent->set_comPort(comPort)) {
			return true;
		}

	}
	delete masterAgentSlotOfAgent;
	return false;
}

MasterAgentSlotOfAgent* MasterAgentHandlerOfAgent :: get_masterAgentSlotAddress() {
	return masterAgentSlotOfAgent;
}

bool MasterAgentHandlerOfAgent :: demount_masterAgent() {
	if(masterAgentSlotOfAgent != NULL) {
		delete masterAgentSlotOfAgent;
		masterAgentSlotOfAgent = NULL;
		return true;
	}
	return false;
}

bool MasterAgentHandlerOfAgent :: set_maxBufferLength(unsigned int maxBufferLength) {
	if(maxBufferLength <= MAX_BUFFER_LENGTH_MASTERAGENT_HANDLER) {
		this->maxBufferLength = maxBufferLength;
		return true;
	}
	return false;
}

unsigned int MasterAgentHandlerOfAgent :: get_maxBufferLength() {
	return maxBufferLength;
}

bool MasterAgentHandlerOfAgent :: pass_msgToSendBuffer(float msg) {
	//TODO: make message handler and shift following lines to it!
	//TODO: try/catch for pushback function!
	Message* message = new Message(msg);
	lSendBuffer.push_back(message);
	return false;
}

bool MasterAgentHandlerOfAgent :: pass_msgToSendBuffer(int msg) {
	//TODO: make message handler and shift following lines to it!
	//TODO: try/catch for pushback function!
	Message* message = new Message(msg);
	lSendBuffer.push_back(message);
	return false;
}

unsigned int MasterAgentHandlerOfAgent :: get_avlSendBuffer() {
	return maxBufferLength - get_occSendBuffer();
}

unsigned int MasterAgentHandlerOfAgent :: get_occSendBuffer() {
	return lSendBuffer.size();
}

bool MasterAgentHandlerOfAgent :: send_msgs() {
	if(masterAgentSlotOfAgent != NULL) {
		Channel* comPort = masterAgentSlotOfAgent->get_comPort();
		if(comPort != NULL) {
			//TODO: also other sending mode... current MODE: only send it when all packets can be sended
			if(get_occSendBuffer() <= comPort->get_avlInputBufferUp()) {
				//for(unsigned int i=0; i<get_occSendBuffer(); i++) 
				while(get_occSendBuffer() > 0){
					//TODO: make message handler and shift following lines to it!
					//TODO: try/catch for pushback function!
					comPort->send_MsgUp(lSendBuffer.front());
					lSendBuffer.pop_front();
					//printf("send something\n");
				}
			}
		}
	}
	return false;
}


bool MasterAgentHandlerOfAgent::read_masterAgentValues() {

	Channel* channel = masterAgentSlotOfAgent->get_comPort();

	if (channel != NULL) {
		int msg;
		if (channel->get_MsgDown(&msg)) {
			if (ISA_SuggestedAbstractedSensoryDataAndReliability) {
				//printf("habe das richtige empfangen!\n");
				while (channel->get_MsgDown(&msg)) {
					float inputValue;
						if (channel->get_MsgDown(&inputValue)) {
							masterAgentSlotOfAgent->addSuggestedScore(msg, inputValue);
							//cout << "added!!!!!!!!!!!!!" << endl;
						}
						else {
							std::cout << "check das mal ab" << endl;
							getchar();
							return false;
						}
				}
				//slaveAgentSlotOfAgent->increaseTimeSinceScoreChange();
				return true;

			}
				
		}
	}
	return false;
}

void MasterAgentHandlerOfAgent::clearSuggestedScores() {
	masterAgentSlotOfAgent->clearSuggestedScores();
	//possibleScores.clear();
}


vector<PossibleScore*>* MasterAgentHandlerOfAgent::getSuggestedScores() {
	return masterAgentSlotOfAgent->getSuggestedScores();
}