//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: mouse.hpp
//      Краткое описание: работа с мышью
//

#ifndef DSE_INPUT_MOUSE_HPP
#define DSE_INPUT_MOUSE_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Kernel/Misc/singleton.hpp>
#include <Darkstar/Input/inputDriver.hpp>

namespace input
{
	const unsigned char DMI_LB = 0;
	const unsigned char DMI_RB = 1;
	const unsigned char DMI_MB = 2;
	const unsigned char DMI_X = 0;
	const unsigned char DMI_Y = 1;
	const unsigned char DMI_Z = 2;

	class Mouse : public ker::SingletonHolder<Mouse>
	{
	private:
		LPDIRECTINPUTDEVICE8 mouse;
		bool is_immediate;
		unsigned int buffer_data_size;

		DIMOUSESTATE2 immediate_data;
		shared_array<DIDEVICEOBJECTDATA> data_buffered;
		DWORD cur_valid_buf_size;

		bool _tryToReacquire();
	public:
		Mouse();
		~Mouse();

		void setImmediateMode();
		void setBufferedMode(const unsigned int buffer_data_size);
		bool getIsImmediateMode() const;
		unsigned int getBufferedDataSize() const;

		bool init(HWND hwnd);

		bool updateBuffer();
		bool updateImmediateData();

		bool getIsButtonDownImmediate(const unsigned char code) const;
		bool getIsButtonReleaseImmediate(const unsigned char code) const;

		bool getIsButtonDownBuffered(const unsigned char code) const;
		bool getIsButtonReleaseBufferred(const unsigned char code) const;

		int getRelMouseMoveImmediate(const unsigned char axis) const;

		int getRelMouseMoveBuffered(const unsigned char axis) const;
	};
};

#endif