
#ifndef SPECTRE_INPUT_MODULE_H
#define SPECTRE_INPUT_MODULE_H

#include <deque>
#include <vector>

#include "InputListener.h"
#include "InputEvent.h"

class Mouse;
class Keyboard;
class InputDevice;
class PlatformInput;

class InputModule
{
public :
	InputModule(PlatformInput *platform);

	virtual ~InputModule();

	Mouse* getMouse();

	Keyboard* getKeyboard();

	void addInputDevice(InputDevice *device);

	void registerListener(InputListener* listener);

	void removeListener(InputListener* listener);

	void postInputEvent(const InputEvent& event);

	// NOTE: Update devices here! (for winapi, process keyboard/mouse messages)
	void update();

protected :

	void dispatch();
	
	typedef std::vector<InputDevice*> InputDeviceVec;
	InputDeviceVec m_devices;

	Mouse *m_mouse;

	Keyboard *m_keyboard;

	// Buffered input queue.
	std::deque<InputEvent> m_buffer;

	std::vector<InputListener*> m_listeners;

	PlatformInput *m_platform;
};

#endif /* SPECTRE_INPUT_MODULE_H */
