#include "stdafx.h"

#include "global.h"
#include "TimePilot.h"
#include "DxWrapper.h"
// Starting Point
int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow)
{

    // standard outout stream in datei umlenken
    FILE *stream;
    freopen_s(&stream, "debugoutput.txt", "w", stdout);

	GAMEWINDOW gw;
	DisplayWindow(&gw, hInstance, nCmdShow);

    TimePilot game(gw, hInstance);  

	//game.MainLoop();  // ich muss hier das Fenster durchreichen, um die WM_QUIT auslösen zu können beim Druck auf ESC

	return 0;
}


// Create the Window Class and the Window
void DisplayWindow(GAMEWINDOW* gw, HINSTANCE hInstance, int nCmdShow)
{
	WNDCLASSEX wc;

	ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.cbSize = sizeof(WNDCLASSEX);
	wc.lpfnWndProc = (WNDPROC)WindowProc;
	wc.hInstance = hInstance;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.lpszClassName = TEXT("WindowClass");

	RegisterClassEx(&wc);

	gw->hWnd = CreateWindowEx(NULL,
		wc.lpszClassName,
		TEXT("Your Game Title Here"),
		gw->Windowed ? WS_OVERLAPPEDWINDOW : WS_EX_TOPMOST|WS_POPUP,
		0, 0,
		gw->Width, gw->Height,
		NULL,
		NULL,
		hInstance,
		NULL);

	ShowWindow(gw->hWnd, nCmdShow);
}

// Check for Messages and Handle
bool HandleMessages()
{
	static MSG msg;

	if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
	{
		if (msg.message == WM_QUIT)
        {
			return FALSE;
        }

        if (msg.message == WM_ACTIVATEAPP)
        {
            std::cout << "WM_ACTIVATEAPP !" << std::endl;
        }

		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return TRUE;
}

// Process the Messages
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
		case WM_DESTROY:
			{
				PostQuitMessage(0);
				return 0;
			} 
			break;

		case WM_ACTIVATEAPP:	// wird jeweils ausgelöst, wenn aus der Applikation raus- oder in die Applikation reingewechselt wurde (Alt-Tab)
			{
				if(wParam)		// wParam ist true, wenn man zurückgewechelt hat, und false wenn man rausgewechselt
                    DxWrapper::Instance()->ResetDevice();
				return 0;
			}
			break;
	}

	return DefWindowProc (hWnd, message, wParam, lParam);
}