
#ifndef SPECTRE_INPUT_EVENT_H
#define SPECTRE_INPUT_EVENT_H

#include <string>
#include <vector>

namespace MouseButton {

	enum Type {
		Unknown,
		Left,
		Right,
		Middle,
		Button1,
		Button2,
		NUM_MBUTTONS,
	};
};

namespace Key {

	enum Type {
		Unknown,
		A,
		B,
		C,
		D,
		E,
		F,
		G,
		H,
		I,
		J,
		K,
		L,
		M,
		N,
		O,
		P,
		Q,
		R,
		S,
		T,
		U,
		V,
		W,
		X,
		Y,
		Z,
		One,
		Two,
		Three,
		Four,
		Five,
		Six,
		Seven,
		Eight,
		Nine,
		Zero,
		Period,
		Comma,
		Enter,
		Backspace,
		Escape,
		Space,
		Capslock,
		Up,
		Down,
		Left,
		Right,
		NUMPAD_1,
		NUMPAD_2,
		NUMPAD_3,
		NUMPAD_4,
		NUMPAD_5,
		NUMPAD_6,
		NUMPAD_7,
		NUMPAD_8,
		NUMPAD_9,
		NUMPAD_0,
		NUMPAD_Enter,
		Home,
		End,
		Insert,
		Delete,
		PageUp,
		PageDown,
		Pause,
		F1,
		F2,
		F3,
		F4,
		F5,
		F6,
		F7,
		F8,
		F9,
		F10,
		F11,
		F12,
		Tab,
		LShift,
		RShift,
		LCtrl,
		RCtrl,
		LAlt,
		RAlt,
		NUM_KEYS,
	};
}

typedef struct InputEvent
{
	enum Type
	{
		None,
		Key,
		MouseButton,
		MousePosition
	};

	struct KeyEvent { 
		Key::Type	code;
		bool		pressed; /* true if pressed, false if released. */

		std::string	getKeyName() const; /* Get the key name */
	};

	struct MouseButtonEvent {
		MouseButton::Type button;
		bool		  pressed; /* true if pressed, false if released. */

		std::string	  getName() const;
	};

	struct MouseEvent {
		unsigned int x;
		unsigned int y;
	};

	Type type;
	union {
		struct KeyEvent		key;
		struct MouseEvent	mouse;
		struct MouseButtonEvent	mouseButton;
	};

	InputEvent(Type type = None);

} InputEvent;

#endif /* SPECTRE_INPUT_EVENT_H */
