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

import typing

from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
from ..types.include_total_count import IncludeTotalCount
from ..types.request_after_opaque_cursor import RequestAfterOpaqueCursor
from ..types.request_page_size import RequestPageSize
from ..types.update_user_roles_params_data import UpdateUserRolesParamsData
from ..types.update_user_roles_response import UpdateUserRolesResponse
from ..types.user_role import UserRole
from ..types.uuid_ import Uuid
from ..types.workspace_user_roles_response import WorkspaceUserRolesResponse
from .raw_client import AsyncRawWorkspacePermissionsClient, RawWorkspacePermissionsClient

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


class WorkspacePermissionsClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawWorkspacePermissionsClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        RawWorkspacePermissionsClient
        """
        return self._raw_client

    def index(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        *,
        include_deactivated: typing.Optional[bool] = None,
        after: typing.Optional[RequestAfterOpaqueCursor] = None,
        page_size: typing.Optional[RequestPageSize] = None,
        include_total_count: typing.Optional[IncludeTotalCount] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SyncPager[UserRole, WorkspaceUserRolesResponse]:
        """
        List user roles for a given workspace. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        include_deactivated : typing.Optional[bool]
            Supports including deactivated users in the response. Default is false.

        after : typing.Optional[RequestAfterOpaqueCursor]
            Opaque Cursor query param for requests returning paginated results.
            <br/>
            NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable.

        page_size : typing.Optional[RequestPageSize]


        include_total_count : typing.Optional[IncludeTotalCount]


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

        Returns
        -------
        SyncPager[UserRole, WorkspaceUserRolesResponse]
            OK

        Examples
        --------
        from frameio import Frameio

        client = Frameio(
            token="YOUR_TOKEN",
        )
        response = client.workspace_permissions.index(
            account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            include_deactivated=True,
            after="<opaque_cursor>",
            page_size=10,
            include_total_count=False,
        )
        for item in response:
            yield item
        # alternatively, you can paginate page-by-page
        for page in response.iter_pages():
            yield page
        """
        return self._raw_client.index(
            account_id,
            workspace_id,
            include_deactivated=include_deactivated,
            after=after,
            page_size=page_size,
            include_total_count=include_total_count,
            request_options=request_options,
        )

    def workspace_user_roles_delete(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        user_id: Uuid,
        *,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Remove a user from a given workspace. <br>Rate Limits: 60 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        user_id : Uuid


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

        Returns
        -------
        None

        Examples
        --------
        from frameio import Frameio

        client = Frameio(
            token="YOUR_TOKEN",
        )
        client.workspace_permissions.workspace_user_roles_delete(
            account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
        )
        """
        _response = self._raw_client.workspace_user_roles_delete(
            account_id, workspace_id, user_id, request_options=request_options
        )
        return _response.data

    def workspace_user_roles_update(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        user_id: Uuid,
        *,
        data: UpdateUserRolesParamsData,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> UpdateUserRolesResponse:
        """
        Update user roles for the given workspace if the user is already added to the workspace. If the user is
          not added to the workspace, the user will be added with the given role. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        user_id : Uuid


        data : UpdateUserRolesParamsData

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

        Returns
        -------
        UpdateUserRolesResponse
            OK

        Examples
        --------
        from frameio import Frameio, UpdateUserRolesParamsData

        client = Frameio(
            token="YOUR_TOKEN",
        )
        client.workspace_permissions.workspace_user_roles_update(
            account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            data=UpdateUserRolesParamsData(
                role="editor",
            ),
        )
        """
        _response = self._raw_client.workspace_user_roles_update(
            account_id, workspace_id, user_id, data=data, request_options=request_options
        )
        return _response.data


class AsyncWorkspacePermissionsClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawWorkspacePermissionsClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        AsyncRawWorkspacePermissionsClient
        """
        return self._raw_client

    async def index(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        *,
        include_deactivated: typing.Optional[bool] = None,
        after: typing.Optional[RequestAfterOpaqueCursor] = None,
        page_size: typing.Optional[RequestPageSize] = None,
        include_total_count: typing.Optional[IncludeTotalCount] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> AsyncPager[UserRole, WorkspaceUserRolesResponse]:
        """
        List user roles for a given workspace. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        include_deactivated : typing.Optional[bool]
            Supports including deactivated users in the response. Default is false.

        after : typing.Optional[RequestAfterOpaqueCursor]
            Opaque Cursor query param for requests returning paginated results.
            <br/>
            NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable.

        page_size : typing.Optional[RequestPageSize]


        include_total_count : typing.Optional[IncludeTotalCount]


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

        Returns
        -------
        AsyncPager[UserRole, WorkspaceUserRolesResponse]
            OK

        Examples
        --------
        import asyncio

        from frameio import AsyncFrameio

        client = AsyncFrameio(
            token="YOUR_TOKEN",
        )


        async def main() -> None:
            response = await client.workspace_permissions.index(
                account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                include_deactivated=True,
                after="<opaque_cursor>",
                page_size=10,
                include_total_count=False,
            )
            async for item in response:
                yield item

            # alternatively, you can paginate page-by-page
            async for page in response.iter_pages():
                yield page


        asyncio.run(main())
        """
        return await self._raw_client.index(
            account_id,
            workspace_id,
            include_deactivated=include_deactivated,
            after=after,
            page_size=page_size,
            include_total_count=include_total_count,
            request_options=request_options,
        )

    async def workspace_user_roles_delete(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        user_id: Uuid,
        *,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Remove a user from a given workspace. <br>Rate Limits: 60 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        user_id : Uuid


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

        Returns
        -------
        None

        Examples
        --------
        import asyncio

        from frameio import AsyncFrameio

        client = AsyncFrameio(
            token="YOUR_TOKEN",
        )


        async def main() -> None:
            await client.workspace_permissions.workspace_user_roles_delete(
                account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.workspace_user_roles_delete(
            account_id, workspace_id, user_id, request_options=request_options
        )
        return _response.data

    async def workspace_user_roles_update(
        self,
        account_id: Uuid,
        workspace_id: Uuid,
        user_id: Uuid,
        *,
        data: UpdateUserRolesParamsData,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> UpdateUserRolesResponse:
        """
        Update user roles for the given workspace if the user is already added to the workspace. If the user is
          not added to the workspace, the user will be added with the given role. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user

        Parameters
        ----------
        account_id : Uuid


        workspace_id : Uuid


        user_id : Uuid


        data : UpdateUserRolesParamsData

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

        Returns
        -------
        UpdateUserRolesResponse
            OK

        Examples
        --------
        import asyncio

        from frameio import AsyncFrameio, UpdateUserRolesParamsData

        client = AsyncFrameio(
            token="YOUR_TOKEN",
        )


        async def main() -> None:
            await client.workspace_permissions.workspace_user_roles_update(
                account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b",
                data=UpdateUserRolesParamsData(
                    role="editor",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.workspace_user_roles_update(
            account_id, workspace_id, user_id, data=data, request_options=request_options
        )
        return _response.data
