#pragma once
#include "./transformer.hpp"

namespace lsp::transform
{
    // ==================== JSON 序列化/反序列化 ====================

    template<typename T>
    std::optional<T> Deserialize(const std::string& json);

    template<typename T>
    std::optional<std::string> Serialize(const T& obj);

    // ==================== 转换为 LSPAny ====================

    /// 任意类型转换为 LSPAny
    ///
    /// 支持的类型：
    /// - 基本类型：bool, int, double, string, nullptr
    /// - 容器类型：vector, map, optional
    /// - LSP 类型：LSPObject, LSPArray, LSPAny
    /// - 用户结构体（需要 glaze 支持）
    inline constexpr auto ToLSPAny = [](const auto& value) {
        return LSPAnyConverter::ToLSPAny(value);
    };

    /// LSPAny 转换为指定类型
    ///
    /// 支持的类型：
    /// - 基本类型：bool, int, double, string
    /// - 容器类型：vector<T>, optional<T>
    /// - LSP 类型：LSPObject, LSPArray
    /// - 用户结构体（需要 glaze 支持）
    inline constexpr auto FromLSPAny = []<typename T>(const protocol::LSPAny& any) -> T {
        return LSPAnyConverter::FromLSPAny<T>(any);
    };

    namespace check
    {
        /// 检查是否为 LSPObject
        bool IsObject(const protocol::LSPAny& any);

        /// 检查是否为 LSPArray
        bool IsArray(const protocol::LSPAny& any);

        /// 检查是否为字符串
        bool IsString(const protocol::LSPAny& any);

        /// 检查是否为数字（integer/uinteger/decimal）
        bool IsNumber(const protocol::LSPAny& any);

        /// 检查是否为布尔值
        bool IsBool(const protocol::LSPAny& any);

        /// 检查是否为 null
        bool IsNull(const protocol::LSPAny& any);
    }

    // ==================== 调试工具 ====================

    namespace debug
    {
        /// 获取 LSPAny 的类型名称字符串
        std::string GetTypeName(const protocol::LSPAny& any);

        /// 将 variant<int, string> 转换为字符串（用于 ID）
        std::string GetIdString(const std::variant<int, std::string>& id);
    }
}

#include "./facade.inl"
