// Copyright 2021 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "Window.hpp"

#if USE_HEADLESS_SURFACE

Window::Window(vk::Instance instance, vk::Extent2D windowSize)
{
	vk::HeadlessSurfaceCreateInfoEXT surfaceCreateInfo;
	surface = instance.createHeadlessSurfaceEXT(surfaceCreateInfo);
	assert(surface);
}

Window::~Window()
{
	instance.destroySurfaceKHR(surface, nullptr);
}

vk::SurfaceKHR Window::getSurface()
{
	return surface;
}

void Window::show()
{
}

#elif defined(_WIN32)

Window::Window(vk::Instance instance, vk::Extent2D windowSize)
{
	windowClass.cbSize = sizeof(WNDCLASSEX);
	windowClass.style = CS_HREDRAW | CS_VREDRAW;
	windowClass.lpfnWndProc = DefWindowProc;
	windowClass.cbClsExtra = 0;
	windowClass.cbWndExtra = 0;
	windowClass.hInstance = moduleInstance;
	windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	windowClass.lpszMenuName = NULL;
	windowClass.lpszClassName = "Window";
	windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

	RegisterClassEx(&windowClass);

	DWORD style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
	DWORD extendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;

	RECT windowRect;
	windowRect.left = 0L;
	windowRect.top = 0L;
	windowRect.right = (long)windowSize.width;
	windowRect.bottom = (long)windowSize.height;

	AdjustWindowRectEx(&windowRect, style, FALSE, extendedStyle);
	uint32_t x = (GetSystemMetrics(SM_CXSCREEN) - windowRect.right) / 2;
	uint32_t y = (GetSystemMetrics(SM_CYSCREEN) - windowRect.bottom) / 2;

	window = CreateWindowEx(extendedStyle, "Window", "Hello",
	                        style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
	                        x, y,
	                        windowRect.right - windowRect.left,
	                        windowRect.bottom - windowRect.top,
	                        NULL, NULL, moduleInstance, NULL);

	SetForegroundWindow(window);
	SetFocus(window);

	// Create the Vulkan surface
	vk::Win32SurfaceCreateInfoKHR surfaceCreateInfo;
	surfaceCreateInfo.hinstance = moduleInstance;
	surfaceCreateInfo.hwnd = window;
	surface = instance.createWin32SurfaceKHR(surfaceCreateInfo);
	assert(surface);
}

Window::~Window()
{
	instance.destroySurfaceKHR(surface, nullptr);
	DestroyWindow(window);
	UnregisterClass("Window", moduleInstance);
}

vk::SurfaceKHR Window::getSurface()
{
	return surface;
}

void Window::show()
{
	ShowWindow(window, SW_SHOW);
}

#else
#	error Window class unimplemented for this platform
#endif
