#pragma once

#include "rm_control/common/result.h"

#include <map>
#include <string>
#include <vector>

namespace rm_control::config {

// 轻量 JSON 值对象。
// 这里没有引入 nlohmann/json，是因为本机环境没有现成依赖；
// 为了让 RM 子工程离线可编译，只实现命令文件需要的 JSON 子集。
class JsonValue {
public:
    enum class Type {
        Null,
        Bool,
        Number,
        String,
        Array,
        Object,
    };

    using Array = std::vector<JsonValue>;
    using Object = std::map<std::string, JsonValue>;

    JsonValue() = default;
    explicit JsonValue(bool value);
    explicit JsonValue(double value);
    explicit JsonValue(std::string value);
    explicit JsonValue(Array value);
    explicit JsonValue(Object value);

    Type type() const;
    bool isNull() const;
    bool isBool() const;
    bool isNumber() const;
    bool isString() const;
    bool isArray() const;
    bool isObject() const;

    bool asBool() const;
    double asNumber() const;
    const std::string &asString() const;
    const Array &asArray() const;
    const Object &asObject() const;

    const JsonValue *find(const std::string &key) const;

private:
    Type type_ = Type::Null;
    bool bool_value_ = false;
    double number_value_ = 0.0;
    std::string string_value_;
    Array array_value_;
    Object object_value_;
};

// 解析标准 JSON 文本。返回 Result，避免解析失败时直接抛异常给 main。
common::Result<JsonValue> parseJson(const std::string &text);

} // namespace rm_control::config
