// Project Lab - NHTV Igad

#ifndef __UNREALPROJECT_H__
#define __UNREALPROJECT_H__

#include "EngineMinimal.h"
#include <append>
#include "Metrics.hpp"
#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"
#include "UnrealNetwork.h"

#define PLATFORM_SPECIFIC_WIN (PLATFORM_PS4 + PLATFORM_MAC + PLATFORM_APPLE)

DECLARE_LOG_CATEGORY_EXTERN(FRANK, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(JAN, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(TED, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(YOSHI, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(GUUS, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(RAUL, Log, All);

namespace Output
{
	void WriteOut(char name, char type, const std::string& message);
	void WriteWOut(wchar_t name, wchar_t type, const std::wstring& message);
}

#define _WRITE_OUT(name, type, msg) Output::WriteOut(name, type, (std::string() + "[" + __FILE__ + ":" + __LINE__ + "]" + msg))
#define _WWRITE_OUT(name, type, msg) Output::WriteWOut(name, type, (std::wstring() + L"[" + (convert_cstring_type<wchar_t, char>(__FILE__)) + L":" + __LINE__ + L"]" + msg))

#define FPRINT(msg) _WRITE_OUT('F', 'L', msg)
#define FWPRINT(msg) _WWRITE_OUT(L'F', L'L', msg)
#define JPRINT(msg) _WRITE_OUT('J', 'L', msg)
#define JWPRINT(msg) _WWRITE_OUT(L'J', L'L', msg)
#define TPRINT(msg) _WRITE_OUT('T', 'L', msg)
#define TWPRINT(msg) _WWRITE_OUT(L'T', L'L', msg)
#define YPRINT(msg) _WRITE_OUT('Y', 'L', msg)
#define YWPRINT(msg) _WWRITE_OUT(L'Y', L'L', msg)
#define GPRINT(msg) _WRITE_OUT('G', 'L', msg)
#define GWPRINT(msg) _WWRITE_OUT(L'G', L'L', msg)
#define RPRINT(msg) _WRITE_OUT('R', 'L', msg)
#define RWPRINT(msg) _WWRITE_OUT(L'R', L'L', msg)

#define FWARNING(msg) _WRITE_OUT('F', 'W', msg)
#define FWWARNING(msg) _WWRITE_OUT(L'F', L'W', msg)
#define JWARNING(msg) _WRITE_OUT('J', 'W', msg)
#define JWWARNING(msg) _WWRITE_OUT(L'J', L'W', msg)
#define TWARNING(msg) _WRITE_OUT('T', 'W', msg)
#define TWWARNING(msg) _WWRITE_OUT(L'T', L'W', msg)
#define YWARNING(msg) _WRITE_OUT('Y', 'W', msg)
#define YWWARNING(msg) _WWRITE_OUT(L'Y', L'W', msg)
#define GWARNING(msg) _WRITE_OUT('G', 'W', msg)
#define GWWARNING(msg) _WWRITE_OUT(L'G', L'W', msg)
#define RWARNING(msg) _WRITE_OUT('R', 'W', msg)
#define RWWARNING(msg) _WWRITE_OUT(L'R', L'W', msg)

#define FERROR(msg) _WRITE_OUT('F', 'E', msg)
#define FWERROR(msg) _WWRITE_OUT(L'F', L'E', msg)
#define JERROR(msg) _WRITE_OUT('J', 'E', msg)
#define JWERROR(msg) _WWRITE_OUT(L'J', L'E', msg)
#define TERROR(msg) _WRITE_OUT('T', 'E', msg)
#define TWERROR(msg) _WWRITE_OUT(L'T', L'E', msg)
#define YERROR(msg) _WRITE_OUT('Y', 'E', msg)
#define YWERROR(msg) _WWRITE_OUT(L'Y', L'E', msg)
#define GERROR(msg) _WRITE_OUT('G', 'E', msg)
#define GWERROR(msg) _WWRITE_OUT(L'G', L'E', msg)
#define RERROR(msg) _WRITE_OUT('R', 'E', msg)
#define RWERROR(msg) _WWRITE_OUT(L'R', L'E', msg)

#endif
