"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
# @generated-id: 3d8e787f97f3

from __future__ import annotations
from .clientcapabilities import ClientCapabilities, ClientCapabilitiesTypedDict
from .mcpprompt import MCPPrompt, MCPPromptTypedDict
from .mcpresource import MCPResource, MCPResourceTypedDict
from .mcpservercardmeta import MCPServerCardMeta, MCPServerCardMetaTypedDict
from .mcpservercardtool import MCPServerCardTool, MCPServerCardToolTypedDict
from .mcpservericon import MCPServerIcon, MCPServerIconTypedDict
from .mcpserverremote import MCPServerRemote, MCPServerRemoteTypedDict
from .mcpserverrepository import MCPServerRepository, MCPServerRepositoryTypedDict
from .servercapabilities import ServerCapabilities, ServerCapabilitiesTypedDict
from mistralai.client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
import pydantic
from pydantic import ConfigDict, model_serializer
from typing import Any, Dict, List, Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict


ResourcesTypedDict = TypeAliasType(
    "ResourcesTypedDict", Union[str, List[MCPResourceTypedDict]]
)


Resources = TypeAliasType("Resources", Union[str, List[MCPResource]])


ToolsTypedDict = TypeAliasType(
    "ToolsTypedDict", Union[str, List[MCPServerCardToolTypedDict]]
)


Tools = TypeAliasType("Tools", Union[str, List[MCPServerCardTool]])


PromptsTypedDict = TypeAliasType(
    "PromptsTypedDict", Union[str, List[MCPPromptTypedDict]]
)


Prompts = TypeAliasType("Prompts", Union[str, List[MCPPrompt]])


class MCPServerCardTypedDict(TypedDict):
    name: str
    r"""Server identifier in reverse-DNS format with exactly one /"""
    version: str
    r"""Server version (semantic versioning preferred)"""
    dollar_schema: NotRequired[Nullable[str]]
    r"""URL to the JSON schema definition"""
    capabilities: NotRequired[ServerCapabilitiesTypedDict]
    r"""Capabilities that a server may support."""
    title: NotRequired[Nullable[str]]
    description: NotRequired[Nullable[str]]
    website_url: NotRequired[Nullable[str]]
    repository: NotRequired[Nullable[MCPServerRepositoryTypedDict]]
    icons: NotRequired[Nullable[List[MCPServerIconTypedDict]]]
    remotes: NotRequired[Nullable[List[MCPServerRemoteTypedDict]]]
    requires: NotRequired[Nullable[ClientCapabilitiesTypedDict]]
    resources: NotRequired[Nullable[ResourcesTypedDict]]
    tools: NotRequired[Nullable[ToolsTypedDict]]
    prompts: NotRequired[Nullable[PromptsTypedDict]]
    meta: NotRequired[Nullable[MCPServerCardMetaTypedDict]]


class MCPServerCard(BaseModel):
    model_config = ConfigDict(
        populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
    )
    __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)

    name: str
    r"""Server identifier in reverse-DNS format with exactly one /"""

    version: str
    r"""Server version (semantic versioning preferred)"""

    dollar_schema: Annotated[OptionalNullable[str], pydantic.Field(alias="$schema")] = (
        UNSET
    )
    r"""URL to the JSON schema definition"""

    capabilities: Optional[ServerCapabilities] = None
    r"""Capabilities that a server may support."""

    title: OptionalNullable[str] = UNSET

    description: OptionalNullable[str] = UNSET

    website_url: Annotated[
        OptionalNullable[str], pydantic.Field(alias="websiteUrl")
    ] = UNSET

    repository: OptionalNullable[MCPServerRepository] = UNSET

    icons: OptionalNullable[List[MCPServerIcon]] = UNSET

    remotes: OptionalNullable[List[MCPServerRemote]] = UNSET

    requires: OptionalNullable[ClientCapabilities] = UNSET

    resources: OptionalNullable[Resources] = UNSET

    tools: OptionalNullable[Tools] = UNSET

    prompts: OptionalNullable[Prompts] = UNSET

    meta: Annotated[
        OptionalNullable[MCPServerCardMeta], pydantic.Field(alias="_meta")
    ] = UNSET

    @property
    def additional_properties(self):
        return self.__pydantic_extra__

    @additional_properties.setter
    def additional_properties(self, value):
        self.__pydantic_extra__ = value  # pyright: ignore[reportIncompatibleVariableOverride]

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "$schema",
                "capabilities",
                "title",
                "description",
                "websiteUrl",
                "repository",
                "icons",
                "remotes",
                "requires",
                "resources",
                "tools",
                "prompts",
                "_meta",
            ]
        )
        nullable_fields = set(
            [
                "$schema",
                "title",
                "description",
                "websiteUrl",
                "repository",
                "icons",
                "remotes",
                "requires",
                "resources",
                "tools",
                "prompts",
                "_meta",
            ]
        )
        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))
            serialized.pop(k, serialized.pop(n, None))
            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
        for k, v in serialized.items():
            m[k] = v

        return m


try:
    MCPServerCard.model_rebuild()
except NameError:
    pass
