#ifndef _INPUTCLASS_H_
#define _INPUTCLASS_H_

///////////////////////////////
// PRE-PROCESSING DIRECTIVES //
///////////////////////////////
#define DIRECTINPUT_VERSION 0x0800

/////////////
// LINKING //
/////////////
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "dxguid.lib")

//////////////
// INCLUDES //
//////////////
#include "Logger.h"
#include <dinput.h>
#include "macro.h"

////////////////////////////////////////////////////////////////////////////////
// Class name: input_class
////////////////////////////////////////////////////////////////////////////////
class input_class
{
public:

	template<typename Container>
	std::vector<bool> get_key_states(const Container& key) const
	{
		std::vector<bool> key_states;
		key_states.reserve(key.size());
		for (auto k : key)
			key_states.push_back(this->is_key_pressed(k));
		return key_states;
	}
	
	input_class();
	input_class(const input_class&);
	~input_class();

	virtual bool Initialize(HINSTANCE, HWND, int, int);
	virtual void Shutdown();
	virtual bool Frame();

	bool IsEscapePressed() const;
	void GetMouseLocation(int&, int&) const;
	bool IsLeftMousePressed() const;
	bool IsRightMousePressed() const;
	void KeyDown(unsigned int);
	void KeyUp(unsigned int);
	bool IsLeftArrowPressed() const;
	bool IsRightArrowPressed() const;
	bool IsScrollUp() const;
	bool IsScrollDown() const;
	bool IsUpArrowPressed() const;
	bool IsDownArrowPressed() const;
	bool IsKeyDown(unsigned int) const;
	bool is_key_pressed(const unsigned int);

	

private:
	bool m_keys[256];

	bool ReadKeyboard();
	bool ReadMouse();
	void ProcessInput();

private:
	IDirectInput8* m_directInput;
	IDirectInputDevice8* m_keyboard;
	IDirectInputDevice8* m_mouse;

	unsigned char m_keyboardState[256];
	DIMOUSESTATE m_mouseState;

	int m_screenWidth, m_screenHeight, m_mouseX, m_mouseY;
	bool m_previousTildeState;

};

#endif