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

import typing

from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.request_options import RequestOptions
from ..types.agent_call_limits import AgentCallLimits
from ..types.agent_sort_by import AgentSortBy
from ..types.asr_conversational_config import AsrConversationalConfig
from ..types.base_turn_config import BaseTurnConfig
from ..types.conversation_config_input import ConversationConfigInput
from ..types.list_speech_engines_response import ListSpeechEnginesResponse
from ..types.privacy_config_input import PrivacyConfigInput
from ..types.sort_direction import SortDirection
from ..types.speech_engine_config import SpeechEngineConfig
from ..types.speech_engine_conversation_initiation_client_data_config import SpeechEngineConversationInitiationClientDataConfig
from ..types.speech_engine_response import SpeechEngineResponse
from ..types.tts_conversational_config_input import TtsConversationalConfigInput
from .raw_client import AsyncRawSpeechEngineClient, RawSpeechEngineClient

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


class SpeechEngineClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawSpeechEngineClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> RawSpeechEngineClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        RawSpeechEngineClient
        """
        return self._raw_client

    def list(
        self,
        *,
        page_size: typing.Optional[int] = None,
        search: typing.Optional[str] = None,
        sort_direction: typing.Optional[SortDirection] = None,
        sort_by: typing.Optional[AgentSortBy] = None,
        cursor: typing.Optional[str] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> ListSpeechEnginesResponse:
        """
        Returns a paginated list of Speech Engine resources.

        Parameters
        ----------
        page_size : typing.Optional[int]
            How many Speech Engines to return at maximum. Can not exceed 100, defaults to 30.

        search : typing.Optional[str]
            Search term to filter Speech Engines by name

        sort_direction : typing.Optional[SortDirection]
            The direction to sort the results

        sort_by : typing.Optional[AgentSortBy]
            The field to sort the results by

        cursor : typing.Optional[str]
            Used for fetching next page. Cursor is returned in the response.

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

        Returns
        -------
        ListSpeechEnginesResponse
            Successful Response

        Examples
        --------
        from elevenlabs import ElevenLabs

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.speech_engine.list(
            page_size=1,
            search="search",
            sort_direction="asc",
            sort_by="name",
            cursor="cursor",
        )
        """
        _response = self._raw_client.list(
            page_size=page_size,
            search=search,
            sort_direction=sort_direction,
            sort_by=sort_by,
            cursor=cursor,
            request_options=request_options,
        )
        return _response.data

    def create(
        self,
        *,
        speech_engine: SpeechEngineConfig,
        name: typing.Optional[str] = OMIT,
        asr: typing.Optional[AsrConversationalConfig] = OMIT,
        tts: typing.Optional[TtsConversationalConfigInput] = OMIT,
        turn: typing.Optional[BaseTurnConfig] = OMIT,
        conversation: typing.Optional[ConversationConfigInput] = OMIT,
        privacy: typing.Optional[PrivacyConfigInput] = OMIT,
        call_limits: typing.Optional[AgentCallLimits] = OMIT,
        language: typing.Optional[str] = OMIT,
        tags: typing.Optional[typing.Sequence[str]] = OMIT,
        overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SpeechEngineResponse:
        """
        Create a new Speech Engine resource

        Parameters
        ----------
        speech_engine : SpeechEngineConfig
            Speech engine WebSocket configuration

        name : typing.Optional[str]
            Name of the speech engine

        asr : typing.Optional[AsrConversationalConfig]
            ASR configuration

        tts : typing.Optional[TtsConversationalConfigInput]
            TTS configuration

        turn : typing.Optional[BaseTurnConfig]
            Turn detection configuration

        conversation : typing.Optional[ConversationConfigInput]
            Conversation configuration (client events, etc.)

        privacy : typing.Optional[PrivacyConfigInput]
            Privacy settings (recording, retention, zero retention mode)

        call_limits : typing.Optional[AgentCallLimits]
            Concurrency and daily conversation limits for this speech engine

        language : typing.Optional[str]
            Language for the speech engine

        tags : typing.Optional[typing.Sequence[str]]
            Tags for categorization

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        from elevenlabs import ElevenLabs, SpeechEngineConfig

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.speech_engine.create(
            speech_engine=SpeechEngineConfig(
                ws_url="ws_url",
            ),
        )
        """
        _response = self._raw_client.create(
            speech_engine=speech_engine,
            name=name,
            asr=asr,
            tts=tts,
            turn=turn,
            conversation=conversation,
            privacy=privacy,
            call_limits=call_limits,
            language=language,
            tags=tags,
            overrides=overrides,
            request_options=request_options,
        )
        return _response.data

    def get(
        self, speech_engine_id: str, *, request_options: typing.Optional[RequestOptions] = None
    ) -> SpeechEngineResponse:
        """
        Retrieve a Speech Engine resource

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        from elevenlabs import ElevenLabs

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.speech_engine.get(
            speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
        )
        """
        _response = self._raw_client.get(speech_engine_id, request_options=request_options)
        return _response.data

    def delete(self, speech_engine_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
        """
        Delete a Speech Engine resource

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

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

        Returns
        -------
        None

        Examples
        --------
        from elevenlabs import ElevenLabs

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.speech_engine.delete(
            speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
        )
        """
        _response = self._raw_client.delete(speech_engine_id, request_options=request_options)
        return _response.data

    def update(
        self,
        speech_engine_id: str,
        *,
        name: typing.Optional[str] = OMIT,
        speech_engine: typing.Optional[SpeechEngineConfig] = OMIT,
        asr: typing.Optional[AsrConversationalConfig] = OMIT,
        tts: typing.Optional[TtsConversationalConfigInput] = OMIT,
        turn: typing.Optional[BaseTurnConfig] = OMIT,
        conversation: typing.Optional[ConversationConfigInput] = OMIT,
        privacy: typing.Optional[PrivacyConfigInput] = OMIT,
        call_limits: typing.Optional[AgentCallLimits] = OMIT,
        language: typing.Optional[str] = OMIT,
        tags: typing.Optional[typing.Sequence[str]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SpeechEngineResponse:
        """
        Update a Speech Engine resource (partial update)

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

        name : typing.Optional[str]

        speech_engine : typing.Optional[SpeechEngineConfig]

        asr : typing.Optional[AsrConversationalConfig]

        tts : typing.Optional[TtsConversationalConfigInput]

        turn : typing.Optional[BaseTurnConfig]

        conversation : typing.Optional[ConversationConfigInput]

        privacy : typing.Optional[PrivacyConfigInput]

        call_limits : typing.Optional[AgentCallLimits]

        language : typing.Optional[str]

        tags : typing.Optional[typing.Sequence[str]]

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        from elevenlabs import ElevenLabs

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.speech_engine.update(
            speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
        )
        """
        _response = self._raw_client.update(
            speech_engine_id,
            name=name,
            speech_engine=speech_engine,
            asr=asr,
            tts=tts,
            turn=turn,
            conversation=conversation,
            privacy=privacy,
            call_limits=call_limits,
            language=language,
            tags=tags,
            request_options=request_options,
        )
        return _response.data


class AsyncSpeechEngineClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawSpeechEngineClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> AsyncRawSpeechEngineClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        AsyncRawSpeechEngineClient
        """
        return self._raw_client

    async def list(
        self,
        *,
        page_size: typing.Optional[int] = None,
        search: typing.Optional[str] = None,
        sort_direction: typing.Optional[SortDirection] = None,
        sort_by: typing.Optional[AgentSortBy] = None,
        cursor: typing.Optional[str] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> ListSpeechEnginesResponse:
        """
        Returns a paginated list of Speech Engine resources.

        Parameters
        ----------
        page_size : typing.Optional[int]
            How many Speech Engines to return at maximum. Can not exceed 100, defaults to 30.

        search : typing.Optional[str]
            Search term to filter Speech Engines by name

        sort_direction : typing.Optional[SortDirection]
            The direction to sort the results

        sort_by : typing.Optional[AgentSortBy]
            The field to sort the results by

        cursor : typing.Optional[str]
            Used for fetching next page. Cursor is returned in the response.

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

        Returns
        -------
        ListSpeechEnginesResponse
            Successful Response

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.speech_engine.list(
                page_size=1,
                search="search",
                sort_direction="asc",
                sort_by="name",
                cursor="cursor",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.list(
            page_size=page_size,
            search=search,
            sort_direction=sort_direction,
            sort_by=sort_by,
            cursor=cursor,
            request_options=request_options,
        )
        return _response.data

    async def create(
        self,
        *,
        speech_engine: SpeechEngineConfig,
        name: typing.Optional[str] = OMIT,
        asr: typing.Optional[AsrConversationalConfig] = OMIT,
        tts: typing.Optional[TtsConversationalConfigInput] = OMIT,
        turn: typing.Optional[BaseTurnConfig] = OMIT,
        conversation: typing.Optional[ConversationConfigInput] = OMIT,
        privacy: typing.Optional[PrivacyConfigInput] = OMIT,
        call_limits: typing.Optional[AgentCallLimits] = OMIT,
        language: typing.Optional[str] = OMIT,
        tags: typing.Optional[typing.Sequence[str]] = OMIT,
        overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SpeechEngineResponse:
        """
        Create a new Speech Engine resource

        Parameters
        ----------
        speech_engine : SpeechEngineConfig
            Speech engine WebSocket configuration

        name : typing.Optional[str]
            Name of the speech engine

        asr : typing.Optional[AsrConversationalConfig]
            ASR configuration

        tts : typing.Optional[TtsConversationalConfigInput]
            TTS configuration

        turn : typing.Optional[BaseTurnConfig]
            Turn detection configuration

        conversation : typing.Optional[ConversationConfigInput]
            Conversation configuration (client events, etc.)

        privacy : typing.Optional[PrivacyConfigInput]
            Privacy settings (recording, retention, zero retention mode)

        call_limits : typing.Optional[AgentCallLimits]
            Concurrency and daily conversation limits for this speech engine

        language : typing.Optional[str]
            Language for the speech engine

        tags : typing.Optional[typing.Sequence[str]]
            Tags for categorization

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs, SpeechEngineConfig

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.speech_engine.create(
                speech_engine=SpeechEngineConfig(
                    ws_url="ws_url",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.create(
            speech_engine=speech_engine,
            name=name,
            asr=asr,
            tts=tts,
            turn=turn,
            conversation=conversation,
            privacy=privacy,
            call_limits=call_limits,
            language=language,
            tags=tags,
            overrides=overrides,
            request_options=request_options,
        )
        return _response.data

    async def get(
        self, speech_engine_id: str, *, request_options: typing.Optional[RequestOptions] = None
    ) -> SpeechEngineResponse:
        """
        Retrieve a Speech Engine resource

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.speech_engine.get(
                speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.get(speech_engine_id, request_options=request_options)
        return _response.data

    async def delete(self, speech_engine_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
        """
        Delete a Speech Engine resource

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

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

        Returns
        -------
        None

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.speech_engine.delete(
                speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.delete(speech_engine_id, request_options=request_options)
        return _response.data

    async def update(
        self,
        speech_engine_id: str,
        *,
        name: typing.Optional[str] = OMIT,
        speech_engine: typing.Optional[SpeechEngineConfig] = OMIT,
        asr: typing.Optional[AsrConversationalConfig] = OMIT,
        tts: typing.Optional[TtsConversationalConfigInput] = OMIT,
        turn: typing.Optional[BaseTurnConfig] = OMIT,
        conversation: typing.Optional[ConversationConfigInput] = OMIT,
        privacy: typing.Optional[PrivacyConfigInput] = OMIT,
        call_limits: typing.Optional[AgentCallLimits] = OMIT,
        language: typing.Optional[str] = OMIT,
        tags: typing.Optional[typing.Sequence[str]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SpeechEngineResponse:
        """
        Update a Speech Engine resource (partial update)

        Parameters
        ----------
        speech_engine_id : str
            The speech engine ID (accepts seng_ or agent_ prefix)

        name : typing.Optional[str]

        speech_engine : typing.Optional[SpeechEngineConfig]

        asr : typing.Optional[AsrConversationalConfig]

        tts : typing.Optional[TtsConversationalConfigInput]

        turn : typing.Optional[BaseTurnConfig]

        conversation : typing.Optional[ConversationConfigInput]

        privacy : typing.Optional[PrivacyConfigInput]

        call_limits : typing.Optional[AgentCallLimits]

        language : typing.Optional[str]

        tags : typing.Optional[typing.Sequence[str]]

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

        Returns
        -------
        SpeechEngineResponse
            Successful Response

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.speech_engine.update(
                speech_engine_id="seng_3701k3ttaq12ewp8b7qv5rfyszkz",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.update(
            speech_engine_id,
            name=name,
            speech_engine=speech_engine,
            asr=asr,
            tts=tts,
            turn=turn,
            conversation=conversation,
            privacy=privacy,
            call_limits=call_limits,
            language=language,
            tags=tags,
            request_options=request_options,
        )
        return _response.data
