#ifndef WINDOW_HPP
#define WINDOW_HPP

#include <string>

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#include "Video_Mode.hpp"
#include "Window_Listener.hpp"
#include "IMM.hpp"

class Window
{
public:
	Window();
	~Window();

	void Initialize(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen);
	void Finalize();

	void Set_Listener(Window_Listener *Listener);

	void Show();
	void Hide();

	void Handle_Events();
	void Display();

	void Show_Cursor();
	void Hide_Cursor();

	HWND Get_Handle();
	IMM &Get_IMM();

private:
	static const wchar_t *Window_Class_Name;

	void Register_Class();
	void Unregister_Class();

	void Create_Window(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen);
	void Destroy_Window();

	void Create_Context(const Video_Mode &Mode);
	void Destroy_Context();

	void Switch_To_Fullscreen(const Video_Mode &Mode);

	LRESULT Handle_Message(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam);
	static LRESULT CALLBACK Window_Procedure(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam);

	HWND my_Handle;
	Video_Mode my_Video_Mode;
	bool my_Fullscreen;
	HDC my_Device_Context;
	HGLRC my_GL_Context;
	bool my_Class_Registered;
	Window_Listener *my_Listener;
	IMM my_IMM;
};

#endif
