#pragma once

/*
	ApplicationFramework
	by John Ryland
	Copyright (c) 2023
*/

////////////////////////////////////////////////////////////////////////////////////
//	Glfw Vulkan Surface

#include "IWindowRenderSurfaceSystem.h"
#include <unordered_map>

class GLFWwindow;

namespace ApplicationFramework {

class Window;
class GlfwWindowSystem;
class VulkanRenderer;

class GlfwVulkanSurface : public IWindowRenderSurfaceSystem
{
public:
    GlfwVulkanSurface(IWindowSystem* windowSystem, IRenderSystem* renderSystem);
    ~GlfwVulkanSurface() override;

    void* CreateWindowSurface(IWindow* window) override;
    void DestroyWindowSurface(IWindow* window, void* surface) override;

    //int CreateVulkanWindowSurface(VkInstance instance, Window* win, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface) override;

    void Initialize() override;
    void Shutdown() override;

    void Prepare() override;
    void Update() override;
    void Render() override;
    void Present() override;

private:
    GlfwWindowSystem* m_windowSystem;
    VulkanRenderer*   m_renderSystem;
};

} // ApplicationFramework namespace
