# 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.pydantic_utilities import pydantic_v1
from ..core.request_options import RequestOptions
from .azure.client import AsyncAzureClient, AzureClient
from .gcs.client import AsyncGcsClient, GcsClient
from .local.client import AsyncLocalClient, LocalClient
from .redis.client import AsyncRedisClient, RedisClient
from .s3.client import AsyncS3Client, S3Client
from .types.export_storage_list_types_response_item import ExportStorageListTypesResponseItem


class ExportStorageClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._client_wrapper = client_wrapper
        self.azure = AzureClient(client_wrapper=self._client_wrapper)
        self.gcs = GcsClient(client_wrapper=self._client_wrapper)
        self.local = LocalClient(client_wrapper=self._client_wrapper)
        self.redis = RedisClient(client_wrapper=self._client_wrapper)
        self.s3 = S3Client(client_wrapper=self._client_wrapper)

    def list_types(
        self, *, request_options: typing.Optional[RequestOptions] = None
    ) -> typing.List[ExportStorageListTypesResponseItem]:
        """
        Retrieve a list of the export storages types.

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

        Returns
        -------
        typing.List[ExportStorageListTypesResponseItem]


        Examples
        --------
        from label_studio_sdk.client import LabelStudio

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.export_storage.list_types()
        """
        _response = self._client_wrapper.httpx_client.request(
            "api/storages/export/types", method="GET", request_options=request_options
        )
        if 200 <= _response.status_code < 300:
            return pydantic_v1.parse_obj_as(typing.List[ExportStorageListTypesResponseItem], _response.json())  # type: ignore
        try:
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, body=_response.text)
        raise ApiError(status_code=_response.status_code, body=_response_json)


class AsyncExportStorageClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._client_wrapper = client_wrapper
        self.azure = AsyncAzureClient(client_wrapper=self._client_wrapper)
        self.gcs = AsyncGcsClient(client_wrapper=self._client_wrapper)
        self.local = AsyncLocalClient(client_wrapper=self._client_wrapper)
        self.redis = AsyncRedisClient(client_wrapper=self._client_wrapper)
        self.s3 = AsyncS3Client(client_wrapper=self._client_wrapper)

    async def list_types(
        self, *, request_options: typing.Optional[RequestOptions] = None
    ) -> typing.List[ExportStorageListTypesResponseItem]:
        """
        Retrieve a list of the export storages types.

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

        Returns
        -------
        typing.List[ExportStorageListTypesResponseItem]


        Examples
        --------
        from label_studio_sdk.client import AsyncLabelStudio

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )
        await client.export_storage.list_types()
        """
        _response = await self._client_wrapper.httpx_client.request(
            "api/storages/export/types", method="GET", request_options=request_options
        )
        if 200 <= _response.status_code < 300:
            return pydantic_v1.parse_obj_as(typing.List[ExportStorageListTypesResponseItem], _response.json())  # type: ignore
        try:
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, body=_response.text)
        raise ApiError(status_code=_response.status_code, body=_response_json)
