"""Native LlamaIndex FunctionTools; no LangChain runtime dependency."""

import sys
from pathlib import Path
from llama_index.core.tools import FunctionTool

try:
    import truefetch_rest as core
except ModuleNotFoundError as error:
    if error.name != "truefetch_rest":
        raise
    sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "python"))
    import truefetch_rest as core

API = core.API
TrueFetchError = core.ToolException


def make_tools(api_key, **options):
    def adapt(rest):
        def invoke(**arguments):
            return rest.invoke(arguments)

        return FunctionTool.from_defaults(
            fn=invoke, name=rest.name, description=rest.description, fn_schema=rest.args_schema
        )

    return [adapt(rest) for rest in core.make_tools(api_key, api_url=API, **options)]


def recover_results(tools, task_id, **options):
    class Reader:
        def __init__(self, tool):
            self.name, self.tool = tool.metadata.name, tool

        def invoke(self, arguments):
            output = self.tool.call(**arguments)
            if output.is_error:
                raise TrueFetchError("TrueFetch read failed; retain the original task ID")
            return output.raw_output

    return core.recover_results([Reader(tool) for tool in tools], task_id, **options)
