#pragma once

#include <cstddef>
#include <nlohmann/json.hpp>
#include <string>
#include <vector>

namespace dragonx {
namespace ui {

struct ConsoleCompletionResult {
    std::vector<std::string> matches;
    std::string commonPrefix;
};

struct ConsoleRpcCall {
    bool valid = false;
    std::string method;
    nlohmann::json params = nlohmann::json::array();
};

enum class ConsoleResultLineRole {
    Result,
    Error,
    JsonKey,
    JsonString,
    JsonNumber,
    JsonBrace
};

struct ConsoleResultLine {
    std::string text;
    ConsoleResultLineRole role = ConsoleResultLineRole::Result;
};

const std::vector<std::string>& ConsoleRpcCommandNames();
void AppendConsoleHistory(std::vector<std::string>& history,
                          const std::string& command,
                          std::size_t maxEntries = 100);
int NavigateConsoleHistoryIndex(int currentIndex,
                                std::size_t historySize,
                                bool up);
std::string ConsoleHistoryEntry(const std::vector<std::string>& history,
                                int historyIndex);
ConsoleCompletionResult CompleteConsoleCommand(const std::string& input);
std::vector<std::string> FormatConsoleCompletionLines(const std::vector<std::string>& matches,
                                                      std::size_t maxLineLength = 60);
std::vector<std::string> ParseConsoleCommandArgs(const std::string& command);
ConsoleRpcCall BuildConsoleRpcCall(const std::string& command);
std::vector<ConsoleResultLine> FormatConsoleRpcResultLines(const std::string& result,
                                                           bool isError);

} // namespace ui
} // namespace dragonx
