#ifndef GAMINGCORE_VULKAN_UTILITY_HPP
#define GAMINGCORE_VULKAN_UTILITY_HPP

#include <core/Logger.hpp>

#include <vulkan/vulkan.h>

namespace Core::Vulkan {
    const char* getResultString(VkResult r);
}

#define VK_REPORT(level, format, ...)                                          \
    REPORT(                                                                    \
        Core::LogLevel::level, "Vulkan | " format __VA_OPT__(, ) __VA_ARGS__);
#define VK_REPORT_ERROR(...) VK_REPORT(ERROR, __VA_ARGS__)
#define VK_REPORT_WARNING(...) VK_REPORT(WARNING, __VA_ARGS__)
#define VK_CHECK(r, a)                                                     \
    do {                                                                   \
        VkResult vkResult = (a);                                           \
        if(vkResult != VK_SUCCESS) {                                       \
            VK_REPORT_ERROR("#", Core::Vulkan::getResultString(vkResult)); \
            return r;                                                      \
        }                                                                  \
    } while(false)
#define VK_CHECK_TRUE(a) VK_CHECK(true, a)
#define VK_CHECK_VOID(a) VK_CHECK(, a)

#endif