
#include <windows.h>
#include "Win32Keyboard.h"
#include "Win32Mouse.h"
#include "Win32Application.h"

void Win32Application::init()
{
}

void Win32Application::shutdown()
{
}

/*
PlatformDisplay& Win32Application::getDisplay()
{
	return m_display;
} */

PlatformInput& Win32Application::getInput()
{
	return m_input;
}

MessageQueue& Win32Application::getMessageQueue()
{
	return m_messageQueue;
}

void Win32Application::update()
{
	MSG msg;

	while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
		TranslateMessage(&msg);
		processMessage(msg);
	}
}

LRESULT Win32Application::processMessage(MSG msg)
{
	switch(msg.message) {
	case WM_QUIT :
		m_messageQueue.postEvent(SysEvent(SysEvent::Quit));
		return 0;
	// Input, Forward to devices.
	case WM_KEYDOWN :
	case WM_KEYUP :
		OutputDebugString("WM_KEYDOWN\n");
		//SetCapture(msg.hwnd);

		if (Win32Keyboard::handleMessage(msg)) {
			// Keyboard did handle the message.
			return 0;
		}
		break;
	case WM_MOUSEMOVE :
	case WM_MOUSELEAVE :

		if (Win32Mouse::handleMessage(msg)) {
			// Mouse did handle the message.
			return 0;
		}
		break;
	case WM_LBUTTONDOWN :
	case WM_RBUTTONDOWN :
	case WM_MBUTTONDOWN :
	case WM_XBUTTONDOWN :

		SetCapture(msg.hwnd);

		if (Win32Mouse::handleMessage(msg)) {
			// Mouse did handle the message.
			return 0;
		}
		break;
	case WM_LBUTTONUP :
	case WM_RBUTTONUP :
	case WM_MBUTTONUP :
	case WM_XBUTTONUP :

		ReleaseCapture();

		if (Win32Mouse::handleMessage(msg)) {
			// Mouse did handle the message.
			return 0;
		}
		break;
	default :
		break;
	}

	// Message was not intercepted. Pass down to window.
	return DispatchMessage(&msg);
}
