#include "MasterAgentHandlerOfAgent.h"
#include <cstdlib>

#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 SlotOfAgent();
  if (masterAgentSlotOfAgent != NULL) {
    if (masterAgentSlotOfAgent->set_comPort(comPort)) {
      return true;
    }
  }
  delete masterAgentSlotOfAgent;
  return false;
}

SlotOfAgent *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();
        }
      }
    }
  }
  return false;
}
