#ifndef EXTERN_HPP_
#define EXTERN_HPP_

// All external libraries must be included through this header only.
// This allows us to potentially change configuration without having to modify the
// main game code. We can also abstract away the various defines needed by the libraries.

#ifdef _MSC_VER // Check if the compiler is MSVC
#   define _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS
#   pragma warning(disable : 4101) // Disable warning for unused variable
#   define NOMINMAX
#else
#   pragma GCC diagnostic push
#   pragma GCC diagnostic ignored "-Wunused-variable"
#   ifdef __clang__
#       pragma GCC diagnostic ignored "-Wnullability-completeness"
#   endif
#endif

#define GLM_FORCE_INTRINSICS
#define GLM_FORCE_RADIANS

#include <SDL3/SDL.h>
#include <SDL3/SDL_vulkan.h>
#include <SDL3/SDL_log.h>

#include <vulkan/vulkan.h>
#include <vulkan/vk_enum_string_helper.h>

#include <vk_mem_alloc.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/euler_angles.hpp>
#include <glm/gtx/compatibility.hpp>
#include <glm/trigonometric.hpp>

#include <AL/al.h>
#include <AL/alc.h>

#include <stb_image.hpp>
#include <stb_image_write.hpp>

#include <cryptopp/scrypt.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/integer.h>

#include <zlib.h>

extern "C" 
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

#ifdef _MSC_VER
#   pragma warning(default : 4101) // Re-enable warning for unused variable
#else
#   pragma GCC diagnostic pop
#endif

#endif