#include "Runtime/Input/CInputGenerator.hpp"

#include "Runtime/CArchitectureMessage.hpp"
#include "Runtime/CArchitectureQueue.hpp"

namespace metaforce {

void CInputGenerator::Update(float dt, CArchitectureQueue& queue) {
  if (m_firstFrame) {
    m_firstFrame = false;
    return;
  }

  /* Keyboard/Mouse first */
  CFinalInput kbInput = getFinalInput(0, dt);
  bool kbUsed = false;

  /* Dolphin controllers next */
  for (int i = 0; i < 4; ++i) {
    bool connected;
    EStatusChange change = m_dolphinCb.getStatusChange(i, connected);
    if (change != EStatusChange::NoChange)
      queue.Push(MakeMsg::CreateControllerStatus(EArchMsgTarget::Game, i, connected));
    if (connected) {
      CFinalInput input = m_dolphinCb.getFinalInput(i, dt, m_leftDiv, m_rightDiv);
      if (i == 0) /* Merge KB input with first controller */
      {
        input |= kbInput;
        kbUsed = true;
      }
      m_lastUpdate = input;
      queue.Push(MakeMsg::CreateUserInput(EArchMsgTarget::Game, input));
    }
  }

  /* Send straight keyboard input if no first controller present */
  if (!kbUsed) {
    m_lastUpdate = kbInput;
    queue.Push(MakeMsg::CreateUserInput(EArchMsgTarget::Game, kbInput));
  }
}

} // namespace metaforce