BareGit
#pragma once

#include <format>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>

#include <mw/error.hpp>
#include <nlohmann/json.hpp>

#include "task.hpp"

class Tool
{
public:
    virtual ~Tool() = default;
    virtual std::string name() const = 0;
    virtual std::string description() const = 0;
    virtual nlohmann::json parametersSchema() const = 0;
    virtual Task<mw::E<std::string>>
    execute(const nlohmann::json& arguments) = 0;
};

class ToolRegistry
{
public:
    mw::E<void> registerTool(std::unique_ptr<Tool> tool);
    mw::E<void> registerToolWithNamespace(const std::string& ns,
                                          std::unique_ptr<Tool> tool);
    Tool* getTool(const std::string& name) const;
    std::vector<Tool*> getAllTools() const;

private:
    std::unordered_map<std::string, std::unique_ptr<Tool>> tools_;
};