"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from .toolagentinfo import ToolAgentInfo, ToolAgentInfoTypedDict
from .tooldefinition import ToolDefinition, ToolDefinitionTypedDict
from .toolpromptinfo import ToolPromptInfo, ToolPromptInfoTypedDict
from .validationissue import ValidationIssue, ValidationIssueTypedDict
from datetime import datetime
from pydantic import model_serializer
from syllable_sdk.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
from typing import List
from typing_extensions import NotRequired, TypedDict


class ToolDetailResponseTypedDict(TypedDict):
    r"""Response model for tool detail endpoint.
    A tool is a function that an agent can call to perform actions like accessing databases,
    making API calls, or processing data. For an agent to have access to a tool, the prompt
    associated with that agent should be linked to the tool and include instructions to use it.
    For more information, see [Console docs](https://docs.syllable.ai/Resources/Tools).
    """

    name: str
    r"""The name of the tool"""
    definition: ToolDefinitionTypedDict
    r"""A tool that can be called from an LLM during the conversation. See https://docs.syllable.ai/Resources/Tools."""
    service_id: int
    r"""Internal ID of the service to which the tool belongs"""
    id: int
    r"""The internal ID of the tool"""
    last_updated: datetime
    r"""The timestamp of the most recent update to the tool"""
    last_updated_by: str
    r"""The email of the user who last updated the tool"""
    fields: List[str]
    r"""Fields that the tool accepts as input"""
    last_updated_comments: NotRequired[Nullable[str]]
    r"""Comments for the most recent edit to the tool."""
    service_name: NotRequired[Nullable[str]]
    r"""The name of the service to which the tool belongs"""
    prompts_info: NotRequired[Nullable[List[ToolPromptInfoTypedDict]]]
    r"""IDs and names of the prompts linked to the tool"""
    agents_info: NotRequired[Nullable[List[ToolAgentInfoTypedDict]]]
    r"""IDs and names of the agents linked to the tool via a prompt"""
    validation_issues: NotRequired[Nullable[List[ValidationIssueTypedDict]]]
    r"""Validation issues found in the tool definition. Warnings and infos are informational; errors block the save."""


class ToolDetailResponse(BaseModel):
    r"""Response model for tool detail endpoint.
    A tool is a function that an agent can call to perform actions like accessing databases,
    making API calls, or processing data. For an agent to have access to a tool, the prompt
    associated with that agent should be linked to the tool and include instructions to use it.
    For more information, see [Console docs](https://docs.syllable.ai/Resources/Tools).
    """

    name: str
    r"""The name of the tool"""

    definition: ToolDefinition
    r"""A tool that can be called from an LLM during the conversation. See https://docs.syllable.ai/Resources/Tools."""

    service_id: int
    r"""Internal ID of the service to which the tool belongs"""

    id: int
    r"""The internal ID of the tool"""

    last_updated: datetime
    r"""The timestamp of the most recent update to the tool"""

    last_updated_by: str
    r"""The email of the user who last updated the tool"""

    fields: List[str]
    r"""Fields that the tool accepts as input"""

    last_updated_comments: OptionalNullable[str] = UNSET
    r"""Comments for the most recent edit to the tool."""

    service_name: OptionalNullable[str] = UNSET
    r"""The name of the service to which the tool belongs"""

    prompts_info: OptionalNullable[List[ToolPromptInfo]] = UNSET
    r"""IDs and names of the prompts linked to the tool"""

    agents_info: OptionalNullable[List[ToolAgentInfo]] = UNSET
    r"""IDs and names of the agents linked to the tool via a prompt"""

    validation_issues: OptionalNullable[List[ValidationIssue]] = UNSET
    r"""Validation issues found in the tool definition. Warnings and infos are informational; errors block the save."""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "last_updated_comments",
                "service_name",
                "prompts_info",
                "agents_info",
                "validation_issues",
            ]
        )
        nullable_fields = set(
            [
                "last_updated_comments",
                "service_name",
                "prompts_info",
                "agents_info",
                "validation_issues",
            ]
        )
        serialized = handler(self)
        m = {}

        for n, f in type(self).model_fields.items():
            k = f.alias or n
            val = serialized.get(k, serialized.get(n))
            is_nullable_and_explicitly_set = (
                k in nullable_fields
                and (self.__pydantic_fields_set__.intersection({n}))  # pylint: disable=no-member
            )

            if val != UNSET_SENTINEL:
                if (
                    val is not None
                    or k not in optional_fields
                    or is_nullable_and_explicitly_set
                ):
                    m[k] = val

        return m
