# 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.http_response import AsyncHttpResponse, HttpResponse
from ..core.pydantic_utilities import parse_obj_as
from ..core.request_options import RequestOptions
from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.http_validation_error import HttpValidationError
from ..types.registry_auth_response import RegistryAuthResponse


class RawRegistryClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._client_wrapper = client_wrapper

    def auth(
        self, *, namespace: str, request_options: typing.Optional[RequestOptions] = None
    ) -> HttpResponse[RegistryAuthResponse]:
        """
        Get short-lived credentials for pushing images to a namespace's registry.

            Each namespace has its own isolated registry repository. The token returned
            can ONLY push images to the specified namespace's repository.

            The CLI uses this endpoint to authenticate with Docker before pushing
            agent images. Returns a token valid for approximately 1 hour.

            **Usage with Docker:**
            ```bash
            docker login {registry_url} -u {username} -p {token}
            docker push {registry_url}/{repository}/{agent}:{tag}
            ```

        Parameters
        ----------
        namespace : str
            Target namespace slug for the image push

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

        Returns
        -------
        HttpResponse[RegistryAuthResponse]
            Successful Response
        """
        _response = self._client_wrapper.httpx_client.request(
            "registry/auth",
            method="GET",
            params={
                "namespace": namespace,
            },
            request_options=request_options,
        )
        try:
            if 200 <= _response.status_code < 300:
                _data = typing.cast(
                    RegistryAuthResponse,
                    parse_obj_as(
                        type_=RegistryAuthResponse,  # type: ignore
                        object_=_response.json(),
                    ),
                )
                return HttpResponse(response=_response, data=_data)
            if _response.status_code == 422:
                raise UnprocessableEntityError(
                    headers=dict(_response.headers),
                    body=typing.cast(
                        HttpValidationError,
                        parse_obj_as(
                            type_=HttpValidationError,  # type: ignore
                            object_=_response.json(),
                        ),
                    ),
                )
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
        raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)


class AsyncRawRegistryClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._client_wrapper = client_wrapper

    async def auth(
        self, *, namespace: str, request_options: typing.Optional[RequestOptions] = None
    ) -> AsyncHttpResponse[RegistryAuthResponse]:
        """
        Get short-lived credentials for pushing images to a namespace's registry.

            Each namespace has its own isolated registry repository. The token returned
            can ONLY push images to the specified namespace's repository.

            The CLI uses this endpoint to authenticate with Docker before pushing
            agent images. Returns a token valid for approximately 1 hour.

            **Usage with Docker:**
            ```bash
            docker login {registry_url} -u {username} -p {token}
            docker push {registry_url}/{repository}/{agent}:{tag}
            ```

        Parameters
        ----------
        namespace : str
            Target namespace slug for the image push

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

        Returns
        -------
        AsyncHttpResponse[RegistryAuthResponse]
            Successful Response
        """
        _response = await self._client_wrapper.httpx_client.request(
            "registry/auth",
            method="GET",
            params={
                "namespace": namespace,
            },
            request_options=request_options,
        )
        try:
            if 200 <= _response.status_code < 300:
                _data = typing.cast(
                    RegistryAuthResponse,
                    parse_obj_as(
                        type_=RegistryAuthResponse,  # type: ignore
                        object_=_response.json(),
                    ),
                )
                return AsyncHttpResponse(response=_response, data=_data)
            if _response.status_code == 422:
                raise UnprocessableEntityError(
                    headers=dict(_response.headers),
                    body=typing.cast(
                        HttpValidationError,
                        parse_obj_as(
                            type_=HttpValidationError,  # type: ignore
                            object_=_response.json(),
                        ),
                    ),
                )
            _response_json = _response.json()
        except JSONDecodeError:
            raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
        raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
