#pragma once
#include <iostream>
#include <string>
#include <cstdlib>
#include <direct.h>
#include "GLEW/glew.h"


/* - GL debugger - */
#define ASSERT(x) if (!(x)) __debugbreak();
#define	GLCALL(x)\
		uniform_location();\
		x;\
		ASSERT(GlLogCall(__FILE__, __LINE__, #x))

void uniform_location();
bool GlLogCall(const char* filepath, int line, const char* function);


/* - Application debugger - */
#define _DEBUGER_INFO_ "# Fractal Debug Console v3.8 #"

class Debugger
{
private:
	static Debugger* mp_debugInstance; // 싱글톤 패턴 구현을 위한 정적 포인터 | Static pointer for singleton pattern debug thread

public:
	Debugger();
	~Debugger();

	bool m_showFps = false; // FPS 표시 여부 | Show FPS in title bar window
	std::string m_filepath = ""; // 캐시된 프로그램 경로

	static Debugger* GetInstance(); // 디버그 클래스의 포인터 값을 반환하는 함수 (싱글톤 스레드) | Return the debug class instance
	static void FreeInstance(); // 디버그 클래스의 포인터를 제거하는 함수 | Delete the debug class instance

	std::string GetProgramPath(); // 실행중인 프로그램 경로를 가져오는 함수 | Get program path
	void ShowGLInfo(); // 그래픽 카드 정보를 출력하는 함수 | Show graphics card information
	void StartHelper(); // 디버깅용 콘솔을 띄우는 함수 | Open debug console
	void WriteMessage(const std::string newString); // 디버깅용 메세지를 출력하는 함수 | Output debug information in debug console
	void WriteError(const std::string newErrorString); // 콘솔에 오류를 표시하는 함수 | Show fatal error in Console (Error message)

};

