# This file was auto-generated by Fern from our API Definition.

import typing
from json.decoder import JSONDecodeError

from ..core.api_error import ApiError
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.http_response import AsyncHttpResponse, HttpResponse
from ..core.pydantic_utilities import parse_obj_as
from ..core.request_options import RequestOptions
from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.connector_tool_invoke_response import ConnectorToolInvokeResponse

# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)


class RawConnectorsToolsClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._client_wrapper = client_wrapper

    def invoke_connector_tool(
        self,
        *,
        tool_name: str,
        arguments: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
        organization_id: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> HttpResponse[ConnectorToolInvokeResponse]:
        """
        Execute a personal connector tool (IMAP, Gmail, ClickUp, Google Drive, etc.) without routing through an LLM. Returns the raw tool result synchronously.

        No LLM token usage, no thread creation, no background jobs. Authentication, credential resolution, and rate limiting apply identically to the agentic loop.

        **tool_name** must match a tool the authenticated user has connected for this organization. Use `GET /v1/personal-connectors/` to list connected connectors.

        Parameters
        ----------
        tool_name : str
            Full connector tool name including the connector prefix. Examples: 'imap_read_email', 'imap_list_emails', 'clickup_filter_tasks'. The prefix must match the connector type (imap_, apple_calendar_, etc.) or a connector tool key the user has connected.

        arguments : typing.Optional[typing.Dict[str, typing.Any]]
            Tool-specific arguments. Schema varies by tool.

        organization_id : typing.Optional[str]
            Target organization ID. Required when authenticating with a multi-org API key. Inferred automatically for Bearer token auth and single-org keys.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        HttpResponse[ConnectorToolInvokeResponse]
            Successful Response
        """
        _response = self._client_wrapper.httpx_client.request(
            "v1/connectors/tools/invoke",
            method="POST",
            json={
                "tool_name": tool_name,
                "arguments": arguments,
                "organization_id": organization_id,
            },
            headers={
                "content-type": "application/json",
            },
            request_options=request_options,
            omit=OMIT,
        )
        try:
            if 200 <= _response.status_code < 300:
                _data = typing.cast(
                    ConnectorToolInvokeResponse,
                    parse_obj_as(
                        type_=ConnectorToolInvokeResponse,  # type: ignore
                        object_=_response.json(),
                    ),
                )
                return HttpResponse(response=_response, data=_data)
            if _response.status_code == 422:
                raise UnprocessableEntityError(
                    headers=dict(_response.headers),
                    body=typing.cast(
                        typing.Any,
                        parse_obj_as(
                            type_=typing.Any,  # type: ignore
                            object_=_response.json(),
                        ),
                    ),
                )
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
        raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)


class AsyncRawConnectorsToolsClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._client_wrapper = client_wrapper

    async def invoke_connector_tool(
        self,
        *,
        tool_name: str,
        arguments: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
        organization_id: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> AsyncHttpResponse[ConnectorToolInvokeResponse]:
        """
        Execute a personal connector tool (IMAP, Gmail, ClickUp, Google Drive, etc.) without routing through an LLM. Returns the raw tool result synchronously.

        No LLM token usage, no thread creation, no background jobs. Authentication, credential resolution, and rate limiting apply identically to the agentic loop.

        **tool_name** must match a tool the authenticated user has connected for this organization. Use `GET /v1/personal-connectors/` to list connected connectors.

        Parameters
        ----------
        tool_name : str
            Full connector tool name including the connector prefix. Examples: 'imap_read_email', 'imap_list_emails', 'clickup_filter_tasks'. The prefix must match the connector type (imap_, apple_calendar_, etc.) or a connector tool key the user has connected.

        arguments : typing.Optional[typing.Dict[str, typing.Any]]
            Tool-specific arguments. Schema varies by tool.

        organization_id : typing.Optional[str]
            Target organization ID. Required when authenticating with a multi-org API key. Inferred automatically for Bearer token auth and single-org keys.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        AsyncHttpResponse[ConnectorToolInvokeResponse]
            Successful Response
        """
        _response = await self._client_wrapper.httpx_client.request(
            "v1/connectors/tools/invoke",
            method="POST",
            json={
                "tool_name": tool_name,
                "arguments": arguments,
                "organization_id": organization_id,
            },
            headers={
                "content-type": "application/json",
            },
            request_options=request_options,
            omit=OMIT,
        )
        try:
            if 200 <= _response.status_code < 300:
                _data = typing.cast(
                    ConnectorToolInvokeResponse,
                    parse_obj_as(
                        type_=ConnectorToolInvokeResponse,  # type: ignore
                        object_=_response.json(),
                    ),
                )
                return AsyncHttpResponse(response=_response, data=_data)
            if _response.status_code == 422:
                raise UnprocessableEntityError(
                    headers=dict(_response.headers),
                    body=typing.cast(
                        typing.Any,
                        parse_obj_as(
                            type_=typing.Any,  # type: ignore
                            object_=_response.json(),
                        ),
                    ),
                )
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
        raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
