# 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 .s3s.client import AsyncS3SClient, S3SClient
from .types.import_storage_list_types_response_item import ImportStorageListTypesResponseItem


class ImportStorageClient:
    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)
        self.s3s = S3SClient(client_wrapper=self._client_wrapper)

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

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

        Returns
        -------
        typing.List[ImportStorageListTypesResponseItem]


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

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.import_storage.list_types()
        """
        _response = self._client_wrapper.httpx_client.request(
            "api/storages/types", method="GET", request_options=request_options
        )
        try:
            if 200 <= _response.status_code < 300:
                return pydantic_v1.parse_obj_as(typing.List[ImportStorageListTypesResponseItem], _response.json())  # type: ignore
            _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 AsyncImportStorageClient:
    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)
        self.s3s = AsyncS3SClient(client_wrapper=self._client_wrapper)

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

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

        Returns
        -------
        typing.List[ImportStorageListTypesResponseItem]


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

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )
        await client.import_storage.list_types()
        """
        _response = await self._client_wrapper.httpx_client.request(
            "api/storages/types", method="GET", request_options=request_options
        )
        try:
            if 200 <= _response.status_code < 300:
                return pydantic_v1.parse_obj_as(typing.List[ImportStorageListTypesResponseItem], _response.json())  # type: ignore
            _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)
