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

namespace Components
{
	class Console : public Component
	{
	public:
		Console();
		~Console();
		const char* GetName() { return "Console"; };

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

	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 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* format, ...);
		static void Create();
		static void Destroy();

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

		static void ConsoleRunner();

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