#pragma once

#define OUTPUT_HEIGHT 250
#define OUTPUT_MAX_TOP (OUTPUT_HEIGHT - (Console::Height - 2))

namespace Components
{
	class Console : public Component
	{
	public:
		Console();
		~Console();

		static void SetSkipShutdown();

		static void FreeNativeConsole();

		static HWND GetWindow();

		static void ShowAsyncConsole();

	private:
		// Text-based console stuff
		static WINDOW* OutputWindow;
		static WINDOW* InputWindow;
		static WINDOW* InfoWindow;

		static int Width;
		static int Height;

		static int OutputTop;
		static int OutBuffer;
		static int LastRefresh;

		static char LineBuffer[1024];
		static char LineBuffer2[1024];
		static int LineBufferIndex;

		static bool HasConsole;
		static bool SkipShutdown;

		static std::thread ConsoleThread;

		static Game::SafeArea OriginalSafeArea;

		static void ShowPrompt();
		static void RefreshStatus();
		static void RefreshOutput();
		static void ScrollOutput(int amount);

		static const char* Input();
		static void Print(const char* message);
		static void Error(const char* fmt, ...);
		static void Create();
		static void Destroy();

		static void StdOutPrint(const char* message);
		static void StdOutError(const char* fmt, ...);

		static void ConsoleRunner();

		static void DrawSolidConsoleStub();
		static void StoreSafeArea();
		static void RestoreSafeArea();

		static void ToggleConsole();
		static char** GetAutoCompleteFileList(const char *path, const char *extension, Game::FsListBehavior_e behavior, int *numfiles, int allocTrackType);

		static void Con_ToggleConsole();
		static void AddConsoleCommand();

		static Game::dvar_t* RegisterConColor(const char* dvarName, float r, float g, float b, float a, float min, float max, unsigned __int16 flags, const char* description);
	};
}